Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всех с Днём Победы! Ура!

В-общем, доделал я то, что хотел...
Вот результат:
Код: Выделить весь код
:: ===================================================================================================================================
:: >> Основные настройки скрипта
@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\ и все её подфайлы/подпапки НЕ надо учитывать при проверке на изменение.
Как такое дело реализовать?

Отправлено: 13:06, 09-05-2011 | #21