Страховое копирование по списку

Относительно простой вариант резервного копирования по списку файлов/папок с учетом типа резервной копии и количества хранимых копий по типам. Классические типы: дневная-недельная-месячная-годовая копии. Кодировка скрипта CP866. В приаттаченом файле содержится сам скрипт, пример файла списка и консольные версии архиватора 7z.

@ECHO OFF CLS SETLOCAL :: Папка для хранения резервных копий - если надо не текущую впишите свою
:: По-умолчанию текущая папка
SET "BACKUP_DIR=%~dp0"
:: Постоянная часть имени архива - для уникальной идентефикации архива
SET "SOURCE_NAME=MY_BACKUP_1"
:: Имя и месторасположение файла со списком для резервного копирования
:: Имена папок пишутся либо с символом "\" в конце либо без него
SET "BACKUP_LIST=%~dp0listbackup.txt"
:: Кодировка списка - доступные варианты: UTF-8, WIN, DOS
SET "LIST_CHARSET=DOS"
::Тип бэкапа: DAY, WEEK, MONTH, YEAR
::День недели число
::1 - Воскресенье
::2 - Понедельник
::3 - Вторник
::4 - Среда
::5 - Четверг
::6 - Пятница
::7 - Суббота
:: День недели бэкап которого считается недельным
SET "WEEK_DAY_BACKUP=1"
:: Бэкап последнего числа месяца считается месячным
:: Бэкап последнего числа года считается годовым
:: Количество хранимых страховых копий по типам
SET "REZERV_DAY=6"
SET "REZERV_WEEK=5"
SET "REZERV_MONTH=11"
SET "REZERV_YEAR=50"
:: ПРИМЕЧАНИЕ: имя архива будет иметь маску:
:: %SOURCE_NAME%_ГГГГ_ММ_ДД_%TYPE_BACKUP%.7z
ECHO.
ECHO %DATE% - %TIME:~0,5% Резервное копирование:
ECHO тело скрипта: "%~0"
ECHO список: "%BACKUP_LIST%"
CALL :BACKUP_PATHS
CALL :SYS_TYPE
CALL :DATE_SET
CALL :ARC
CALL :REZERV_TRIM
ENDLOCAL
GOTO :EOF
:SYS_TYPE
:: Определение разрядности системы для использования нужной версии архиватора
ECHO "%PROCESSOR_ARCHITECTURE%""%PROCESSOR_ARCHITEW6432%"|1>NUL 2>NUL FIND /I "AMD64"&&SET "ARC_DIR=%~dp0X64"||SET "ARC_DIR=%~dp0X32"
:: Отбрасывание последнего символа "\" в пути архиватора
SET "LAST_CHAR=%ARC_DIR:~-1%"
IF "%LAST_CHAR%"=="\" SET "ARC_DIR=%ARC_DIR:~0,-1%"
IF NOT EXIST "%ARC_DIR%\7z.exe" (
ECHO Не обнаружен архиватор по пути "%ARC_DIR%"!
ECHO Положите соответсвующую версию 7z.exe по пути .\X64 или .\X86 и перезапустите скрипт!
CALL :ERROR 1
)
GOTO :EOF
:BACKUP_PATHS
:: Отбрасывание последнего символа "\" в пути бэкапа
SET "LAST_CHAR=%BACKUP_DIR:~-1%"
IF "%LAST_CHAR%"=="\" SET "BACKUP_DIR=%BACKUP_DIR:~0,-1%"
:: Создание целевой папки для резервного копирования с проверкой существования
IF NOT EXIST "%BACKUP_DIR%" MD "%BACKUP_DIR%"
IF NOT EXIST "%BACKUP_DIR%" (
ECHO Указанная папка для создания копии недоступна!
CALL :ERROR 2
)
ECHO Резервная копия будет создана в папке %BACKUP_DIR%
GOTO :EOF
:DATE_SET
:: Определение параметров текущей даты и типа бэкапа
ECHO wscript.ECHO YEAR(DATE)^&"_"^&RIGHT(0^&MONTH(DATE),2)^&"_"^&RIGHT(0^&DAY(DATE),2)^&"_"^& DAY(DATESERIAL(YEAR(DATE),MONTH(DATE)+1,1-1))^&"_"^&WEEKDAY(DATE)^&"_"^&RIGHT(0^&hour(TIME),2)^&"_"^&RIGHT(0^&minute(TIME),2) 1>"%TEMP%\tmp.vbs"
FOR /F "TOKENS=1,2,3,4,5,6,7 DELIMS=_" %%a IN ('cscript "%TEMP%\tmp.vbs" //Nologo') DO SET "TEK_YEAR=%%a"&SET "TEK_MONTH=%%b"&SET "TEK_DAY=%%c"&SET "LAST_DAY=%%d"&SET "TEK_WEEK=%%e"&SET "TEK_HOUR=%%f"&SET "TEK_MINUTE=%%g"
IF EXIST "%TEMP%\tmp.vbs" DEL "%TEMP%\tmp.vbs"
SET "TYPE_BACKUP=DAY"
IF "%WEEK_DAY_BACKUP%"=="%TEK_WEEK%" SET "TYPE_BACKUP=WEEK"
IF "%TEK_DAY%"=="%LAST_DAY%" SET "TYPE_BACKUP=MONTH"
IF "%TEK_MONTH%"=="12" (IF "%TEK_DAY%"=="%LAST_DAY%" (SET "TYPE_BACKUP=YEAR"))
CALL SET "REZERV_NUM=%%REZERV_%TYPE_BACKUP%%%"
SET "ARC_NAME=%SOURCE_NAME%_%TEK_YEAR%_%TEK_MONTH%_%TEK_DAY%~%TYPE_BACKUP%"
IF EXIST "%BACKUP_DIR%\%ARC_NAME%.7z" (
ECHO Резервная копия за этот день уже создана!
ECHO Удалите или переименуйте ее и запустите скрипт повторно!
CALL :ERROR 3
)
GOTO :EOF
:ARC
IF EXIST "%ARC_DIR%\7z.exe" (
1>nul "%ARC_DIR%\7z.exe" a -t7z "%BACKUP_DIR%\%ARC_NAME%.7z" @"%BACKUP_LIST%" -ms -mmt -mx7 -bd -scs%LIST_CHARSET% -ssw
ECHO Страховая копия создана...
)
GOTO :EOF
:REZERV_TRIM
ECHO Удалены устаревшие резервные копии:
FOR /F "SKIP=%REZERV_NUM% USEBACKQ TOKENS=1 DELIMS=" %%a IN (`DIR /O:-N /B "%BACKUP_DIR%\%SOURCE_NAME%_20??_??_??~%TYPE_BACKUP%.7z"`) DO (
DEL /Q /F "%BACKUP_DIR%\%%a"
ECHO "%BACKUP_DIR%\%%a"
)
GOTO :EOF
:ERROR
ECHO Произошло досадное недоразумение - резервная копия не создана ...
ENDLOCAL
EXIT %~1

В случае необходимости ведения лога перенаправьте информационные сообщения скрипта в файл.

Файлы: 
ВложениеРазмер
Файл simple_backup.7z697 КБ

Похожие материалы по этой теме на сайте

Содержимое
Интерпретатор CMD - вывод переменных со спецсимволами на экран и в файл

Известная, но слабоосвещенная тема - обработка в коммандном интерпретаторе CMD данных со спецсимволами.
В большинстве ситуаций она вполне решаема...
Плюс к этому периодически возникают задачи вывода в файл без перевода строки....

Скрипты для CMD

Скрипты выполняемые интерпретатором CMD.EXE - стандартной консольной оболочкой для Win2000/WinXP/Vista/Seven/Win8/Win2000 Server/Win2003/Win2008.

Преобразование файлов 1CClientBankExchange в табличную форму

Лично мне периодически приходилось сталкиваться с обработкой данных не в табличной форме, а в "именованном формате" то есть когда каждый параметр пишется на отдельной строке в виде Параметр=Значение параметра причем файл...

Чтение данных из реестра в переменную окружения

Продвинутый кросплатформенный модуль для встраивания в скрипты, позволяющий в удобной форме получать данные из реестра для дальнейшего использования(как всегда - кодировка скрипта CP866):

Поддержка папок для сканирования

Часто в офисе присутствуют сетевые устройства сканирования, которые поддерживают сканирование в сетевую папку. Все бы было хорошо если бы для этих устройств

Перевод столбца в строку

Преобразование столбца в строку с заданными разделителями и обрамлением. Кодировка скрипта CP866.
Символ двойной кавычки при этом не удастся использовать как разделитель или обрамление.

Настройка TS Easy Print на сервере терминалов Windows Server 2012 R2

Технология TS Easy Print является альтернативой стандартной службе печати, появилась впервые в Windows Server 2008R2.

Перенос данных пользователя

Наткнулся на простейшую статью по поводу переноса данных. Сам постоянно использую, но времени хоть в двух словах описать не было.