frid-karatel
09-05-2011, 13:06
Всех с Днём Победы! Ура!
В-общем, доделал я то, что хотел... :)
Вот результат:
:: ==================================================================================================== ===============================
:: >> Основные настройки скрипта
@ECHO OFF
SETLOCAL enabledelayedexpansion
:: << << <<
:: ==================================================================================================== ===============================
:: >> Назначаем необходимые переменные
:: Папка, куда необходимо копировать резервные копии
SET $BACKUP_DIR_PARENT=S:\Backup
:: Путь до архиватора
SET $WINRAR=C:\Program Files\WinRAR\WinRAR.exe
:: << << <<
:: ==================================================================================================== ===============================
REM >> Определяем массив папок для копирования
SET $FOLDER:01=C:\Documents
SET $FOLDER:02=C:\Letters
SET $FOLDER:03=C:\ThirdFolder
:: ...и так далее...
:: << << <<
:: ==================================================================================================== ===============================
:: >> Список файлов, которые не учитывать при проверки изменения папки
SET $FILE_EXCLUDE:01=Thumbs.db
SET $FILE_EXCLUDE:02=.access_log
SET $FILE_EXCLUDE:03=.error_log
SET $FILE_EXCLUDE:04=.cookie
:: << << <<
:: ==================================================================================================== ===============================
:: >> Проход по всем папкам и проверка, есть ли изменения
FOR /f "tokens=2 delims==" %%f IN ('SET $FOLDER') DO (
SET $FOLDER_CURRENT=%%f
REM >> Определяем папку для резервных копий текущей папки
SET $BACKUP_DIR=!$BACKUP_DIR_PARENT!\!COMPUTERNAME!\!$FOLDER_CURRENT::=!
REM << << <<
REM >> Если папки не существует, то создаём её
IF NOT EXIST "!$BACKUP_DIR!" (
MKDIR "!$BACKUP_DIR!"
)
REM << << <<
REM >> Определение даты последней резервной копии
REM Через команду DIR получаем список файлов с расширением RAR
REM Затем выполняем поиск самого свежего (последнего изменённого) файла
REM Дату последнего изменения устанавливаем исходя из даты изменения самого свежего файла
SET $LAST_MODIFIED=0
PUSHD "!$BACKUP_DIR!"
FOR /f "tokens=1,2,4" %%a IN ('DIR /TW /A-D-H *.rar ^| findstr /B "[0-9]"') DO (
FOR /f "tokens=1-5 delims=.:" %%i IN ("%%a.%%b") DO (
IF "%%k%%j%%i%%l%%m" GTR "!$LAST_MODIFIED!" (
SET $LAST_MODIFIED=%%k%%j%%i%%l%%m
)
)
)
POPD
REM << << <<
REM >> Выполняем поиск изменённых файлов
SET $IS_MODIFIED=
PUSHD "!$FOLDER_CURRENT!"
FOR /f "tokens=1,2,4" %%a IN ('DIR /S /TW /A-D-H ^| findstr /B "[0-9]"') DO (
IF NOT DEFINED $IS_MODIFIED (
SET $CURRENT_FILE=%%c
REM >> Проверяем, находится ли файл в исключениях
SET $EXTRUDED=
FOR /f "tokens=2 delims==" %%e IN ('SET $FILE_EXCLUDE') DO (
IF NOT DEFINED $EXTRUDED (
IF "%%e"=="!$CURRENT_FILE!" (
SET $EXTRUDED=1
)
)
)
REM << << <<
REM >> Если файл не находится в исключениях, то обрабатываем его
IF NOT DEFINED $EXTRUDED (
FOR /f "tokens=1-5 delims=.:" %%i IN ("%%a.%%b") DO (
IF "%%k%%j%%i%%l%%m" GTR "!$LAST_MODIFIED!" (
SET $IS_MODIFIED=1
)
)
)
REM << << <<
)
)
POPD
REM << << <<
REM >> Если в папке имеются изменения, то сделать её резервную копию
IF DEFINED $IS_MODIFIED (
PUSHD "!$FOLDER_CURRENT!"
REM >> Если изменения есть, то упаковываем папку в архив
REM A Добавить в архив
REM -CFG- Игнорировать профиль по умолчанию и переменную окружения
REM -DH Открывать совместно используемые файлы
REM -EP1 Исключить базовую папку из пути
REM -INUL Не выводить сообщения об ошибках
REM -M5 Метод сжатия: максимальный
REM -R Включая вложенные папки
REM -S Создать непрерывный архив
REM -TL Установить время архива по времени новейшего файла
REM -Y Подразумевать ответ "Да" на все вопросы
REM -X{NAME} Не обрабатывать файл/папку NAME. [-x*\temp\] - искл. все папки temp и файлы внутри папок temp
"!$WINRAR!" A "backup" -CFG- -DH -EP1 -INUL -M5 -R -S -TL -Y "!$FOLDER_CURRENT!\"
REM << << <<
REM >> Определяем дату самого последнего изменения в папке исходя из даты созданий архива
REM Через команду DIR получаем строку, содержащую информацию о файле backup
REM Затем берём из строки дату изменения ГГГГ.ММ.ДД и время ЧЧ:ММ
REM Согласно полученой дате устанавливаем имя RAR-архива для резервной копии
FOR /f "tokens=1,2" %%a IN ('DIR /TW /A-D-H backup.rar ^| findstr /B "[0-9]"') DO (
FOR /f "tokens=1-5 delims=.:" %%i IN ("%%a.%%b") DO (
SET $BACKUP_FILENAME=%%k-%%j-%%i %%l-%%m
)
)
REM << << <<
REM >> Перемещаем созданный архив в папку для резервных копий
MOVE "backup.rar" "!$BACKUP_DIR!\!$BACKUP_FILENAME!.rar"
REM << << <<
POPD
)
REM << << <<
)
:: << << <<
:: ==================================================================================================== ===============================
Тут ещё есть пара вариантов, которые хочу доработать.
И по одному из них не знаю, как сделать...
В данном случае у меня есть список файлов, которые не учитывать при проверке на последнее изменение - это $FILE_EXCLUDE.
Хотелось бы иметь возможность исключать не только файлы, но и подпапки.
Дело в том, что в некоторых проектах есть HTML-кэш, который изменяется почти каждый час...
Соответственно, папку \cache\ и все её подфайлы/подпапки НЕ надо учитывать при проверке на изменение.
Как такое дело реализовать?
В-общем, доделал я то, что хотел... :)
Вот результат:
:: ==================================================================================================== ===============================
:: >> Основные настройки скрипта
@ECHO OFF
SETLOCAL enabledelayedexpansion
:: << << <<
:: ==================================================================================================== ===============================
:: >> Назначаем необходимые переменные
:: Папка, куда необходимо копировать резервные копии
SET $BACKUP_DIR_PARENT=S:\Backup
:: Путь до архиватора
SET $WINRAR=C:\Program Files\WinRAR\WinRAR.exe
:: << << <<
:: ==================================================================================================== ===============================
REM >> Определяем массив папок для копирования
SET $FOLDER:01=C:\Documents
SET $FOLDER:02=C:\Letters
SET $FOLDER:03=C:\ThirdFolder
:: ...и так далее...
:: << << <<
:: ==================================================================================================== ===============================
:: >> Список файлов, которые не учитывать при проверки изменения папки
SET $FILE_EXCLUDE:01=Thumbs.db
SET $FILE_EXCLUDE:02=.access_log
SET $FILE_EXCLUDE:03=.error_log
SET $FILE_EXCLUDE:04=.cookie
:: << << <<
:: ==================================================================================================== ===============================
:: >> Проход по всем папкам и проверка, есть ли изменения
FOR /f "tokens=2 delims==" %%f IN ('SET $FOLDER') DO (
SET $FOLDER_CURRENT=%%f
REM >> Определяем папку для резервных копий текущей папки
SET $BACKUP_DIR=!$BACKUP_DIR_PARENT!\!COMPUTERNAME!\!$FOLDER_CURRENT::=!
REM << << <<
REM >> Если папки не существует, то создаём её
IF NOT EXIST "!$BACKUP_DIR!" (
MKDIR "!$BACKUP_DIR!"
)
REM << << <<
REM >> Определение даты последней резервной копии
REM Через команду DIR получаем список файлов с расширением RAR
REM Затем выполняем поиск самого свежего (последнего изменённого) файла
REM Дату последнего изменения устанавливаем исходя из даты изменения самого свежего файла
SET $LAST_MODIFIED=0
PUSHD "!$BACKUP_DIR!"
FOR /f "tokens=1,2,4" %%a IN ('DIR /TW /A-D-H *.rar ^| findstr /B "[0-9]"') DO (
FOR /f "tokens=1-5 delims=.:" %%i IN ("%%a.%%b") DO (
IF "%%k%%j%%i%%l%%m" GTR "!$LAST_MODIFIED!" (
SET $LAST_MODIFIED=%%k%%j%%i%%l%%m
)
)
)
POPD
REM << << <<
REM >> Выполняем поиск изменённых файлов
SET $IS_MODIFIED=
PUSHD "!$FOLDER_CURRENT!"
FOR /f "tokens=1,2,4" %%a IN ('DIR /S /TW /A-D-H ^| findstr /B "[0-9]"') DO (
IF NOT DEFINED $IS_MODIFIED (
SET $CURRENT_FILE=%%c
REM >> Проверяем, находится ли файл в исключениях
SET $EXTRUDED=
FOR /f "tokens=2 delims==" %%e IN ('SET $FILE_EXCLUDE') DO (
IF NOT DEFINED $EXTRUDED (
IF "%%e"=="!$CURRENT_FILE!" (
SET $EXTRUDED=1
)
)
)
REM << << <<
REM >> Если файл не находится в исключениях, то обрабатываем его
IF NOT DEFINED $EXTRUDED (
FOR /f "tokens=1-5 delims=.:" %%i IN ("%%a.%%b") DO (
IF "%%k%%j%%i%%l%%m" GTR "!$LAST_MODIFIED!" (
SET $IS_MODIFIED=1
)
)
)
REM << << <<
)
)
POPD
REM << << <<
REM >> Если в папке имеются изменения, то сделать её резервную копию
IF DEFINED $IS_MODIFIED (
PUSHD "!$FOLDER_CURRENT!"
REM >> Если изменения есть, то упаковываем папку в архив
REM A Добавить в архив
REM -CFG- Игнорировать профиль по умолчанию и переменную окружения
REM -DH Открывать совместно используемые файлы
REM -EP1 Исключить базовую папку из пути
REM -INUL Не выводить сообщения об ошибках
REM -M5 Метод сжатия: максимальный
REM -R Включая вложенные папки
REM -S Создать непрерывный архив
REM -TL Установить время архива по времени новейшего файла
REM -Y Подразумевать ответ "Да" на все вопросы
REM -X{NAME} Не обрабатывать файл/папку NAME. [-x*\temp\] - искл. все папки temp и файлы внутри папок temp
"!$WINRAR!" A "backup" -CFG- -DH -EP1 -INUL -M5 -R -S -TL -Y "!$FOLDER_CURRENT!\"
REM << << <<
REM >> Определяем дату самого последнего изменения в папке исходя из даты созданий архива
REM Через команду DIR получаем строку, содержащую информацию о файле backup
REM Затем берём из строки дату изменения ГГГГ.ММ.ДД и время ЧЧ:ММ
REM Согласно полученой дате устанавливаем имя RAR-архива для резервной копии
FOR /f "tokens=1,2" %%a IN ('DIR /TW /A-D-H backup.rar ^| findstr /B "[0-9]"') DO (
FOR /f "tokens=1-5 delims=.:" %%i IN ("%%a.%%b") DO (
SET $BACKUP_FILENAME=%%k-%%j-%%i %%l-%%m
)
)
REM << << <<
REM >> Перемещаем созданный архив в папку для резервных копий
MOVE "backup.rar" "!$BACKUP_DIR!\!$BACKUP_FILENAME!.rar"
REM << << <<
POPD
)
REM << << <<
)
:: << << <<
:: ==================================================================================================== ===============================
Тут ещё есть пара вариантов, которые хочу доработать.
И по одному из них не знаю, как сделать...
В данном случае у меня есть список файлов, которые не учитывать при проверке на последнее изменение - это $FILE_EXCLUDE.
Хотелось бы иметь возможность исключать не только файлы, но и подпапки.
Дело в том, что в некоторых проектах есть HTML-кэш, который изменяется почти каждый час...
Соответственно, папку \cache\ и все её подфайлы/подпапки НЕ надо учитывать при проверке на изменение.
Как такое дело реализовать?