|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Найти, есть ли в папке (и подпапках) изменённые файлы с указанной даты |
|
CMD/BAT - [решено] Найти, есть ли в папке (и подпапках) изменённые файлы с указанной даты
|
Новый участник Сообщения: 14 |
Доброго времени суток!
Возник вопрос... Как можно средствами BAT-файла найти, есть ли изменённые файлы в указанной папке (включая подкапки)? Вкратце опишу, для чего мне это необходимо: 1. Указываю папку через SET $DEST_DIR=C:\Documents 2. Затем скрипт проверяет, есть ли в папке изменившиеся файлы (хотя бы один) 3. Если есть хотя бы один изменённый файл, то скрипт запускает WinRAR из консоли и делает т.н. резервную копию всей папки 4. Затем созданный архив перемещает на сетевой диск... |
|
Отправлено: 18:41, 08-05-2011 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать А обязательно использовать %%i?
Или вместо i можно использовать f, g и вообще, любую другую букву? Просто с BAT знаком на уровне новичка-любителя... ![]() И попутно вопрос... В моём случае при использовании проверки IF NOT DEFINED необходимо делать undefine для флага $IS_DEFINED... А как? Ошибка синтаксиса... ![]() ::==================================================================================================================================== :: >> Основные настройки скрипта @ECHO OFF SETLOCAL :: << << << ::==================================================================================================================================== :: >>Назначаем необходимые переменные :: Папка, куда необходимо копировать резервные копии SET $BACKUP_DIR=S:\Backup :: Путь до архиватора SET $WINRAR=C:\Program Files\WinRAR\WinRAR.exe :: Имя компьютера :: %COMPUTERNAME% :: Дата, согласно которой проверять файлы на изменение SET $MODIFIED_SINCE=20110323 :: << << << ::==================================================================================================================================== :: >> Определяем массив папок для копирования SET "$FOLDER:01=C:\Documents" SET "$FOLDER:02=C:\Letters" SET "$FOLDER:03=C:\ThirdFolder" :: ...и так далее... :: << << << ::==================================================================================================================================== :: >> Проход по всем папкам и проверка, есть ли изменения FOR /f "tokens=2 delims==" %%i IN ('SET $FOLDER') DO ( :: >> Устанавливаем текущий каталог SET $FOLDER_CURRENT=%%i PUSHD "%$FOLDER_CURRENT%" :: << << << :: >> Выполняем поиск изменённых файлов FOR /f "tokens=1" %%i IN ('DIR /s /tw /a-d') DO ( IF NOT DEFINED $IS_MODIFIED ( CALL:@check %%i ) ) :: << << << :: >> Проверка результата поиска изменённых файлов. Если изменений нет, то ничего не делаем :@next POPD IF NOT DEFINED $IS_MODIFIED ( GOTO:@continue ) :: << << << :: >> Если изменения есть, то упаковываем папку в архив ::A Добавить в архив ::-AG+[FORMAT] Добавить к имени архива текущие дату и время. Если перед FORMAT стоит +, то дата будет добавлена перед именем ::CH -TL Установить время архива по времени новейшего файла ::-DH Открывать совместно используемые файлы ::-EP1 Исключить базовую папку из пути ::-INUL Не выводить сообщения об ошибках ::-M5 Метод сжатия: максимальный ::-S Создать непрерывный архив ::-Y Подразумевать ответ "Да" на все вопросы ::-X{NAME} Не обрабатывать файл/папку NAME. [-x*\temp\] - искл. все папки temp и файлы внутри папок temp "%$WINRAR%" A -AG+YYYY-MM-DD CH -TL -DH -EP1 -ISNUL -M5 -S -Y "%$FOLDER_CURRENT%" "" :: << << << :@continue ) :: << << << ::==================================================================================================================================== GOTO:@exit ::==================================================================================================================================== :: >> Поиск изменённых файлов :@check FOR /f "tokens=1-3 delims=." %%i IN ("%1") DO ( IF %%k%%j%%i geq %$MODIFIED_SINCE% ( SET $IS_MODIFIED=1 ) ) GOTO:eof :: << << << ::==================================================================================================================================== :@exit PAUSE |
Последний раз редактировалось frid-karatel, 08-05-2011 в 21:33. Причина: Добавил код Отправлено: 21:24, 08-05-2011 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1758
|
Цитата frid-karatel:
Например: |
|
Отправлено: 21:31, 08-05-2011 | #12 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Foreigner, спасибо, интересное замечание.
|
Отправлено: 21:41, 08-05-2011 | #13 |
Ветеран Сообщения: 1758
|
frid-karatel, если вы определяете переменную внутри блока кода ( цикл for, if и т.д. ), ограниченного скобками, то повторное использование этой переменной требует установки 'setlocal enabledelayedexpansion' и использование переменных, заключенных в '!' а не в '%'. В вашем батнике это должно быть так, не проверял:
@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION SET "$BACKUP_DIR=S:\Backup" SET "$WINRAR=C:\Program Files\WinRAR\WinRAR.exe" SET "$MODIFIED_SINCE=20110323" SET "$FOLDER:01=C:\Documents" SET "$FOLDER:02=C:\Letters" SET "$FOLDER:03=C:\ThirdFolder" FOR /f "tokens=2 delims==" %%i IN ('SET $FOLDER') DO ( SET "$FOLDER_CURRENT=%%i" PUSHD "!$FOLDER_CURRENT!" FOR /f "tokens=1" %%i IN ('DIR /s /tw /a-d') DO ( IF NOT DEFINED $IS_MODIFIED CALL:@check %%i ) POPD IF NOT DEFINED $IS_MODIFIED GOTO:@continue "%$WINRAR%" A -AG+YYYY-MM-DD CH -TL -DH -EP1 -ISNUL -M5 -S -Y "!$FOLDER_CURRENT!" "" :@continue REM ) GOTO:@exit :@check FOR /f "tokens=1-3 delims=." %%i IN ("%1") DO ( IF %%k%%j%%i geq %$MODIFIED_SINCE% SET $IS_MODIFIED=1 ) GOTO:eof :@exit PAUSE |
Отправлено: 22:00, 08-05-2011 | #14 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Так, ошибку в своём коде исправил - заменил некоторые :: на REM...
Пока выкладывать код не буду - выложу чуть попозже... ![]() Попутно возникли ещё вопросы... 1. Как из пути "C:\ParentFolder\ChildFolder\SomeChildFolder\" получить путь "S:\Backup\C\ParentFolder\ChildFolder\SomeChildFolder"? Это необходимо, чтобы соблюсти иерархию... Вообще, требуется в результате иметь "S:\Backup\%COMPUTERNAME%\C\ParentFolder\ChildFolder\SomeChildFolder"... 2. Как получить дату создания самого нового файла в папке? В данном случае, мне надо получить дату самого последнего RAR-файла в папке "S:\Backup". Тут можно попроще что-нибудь, так как имя файла равно дате в формате YYYY-MM-DD 3. Как обнулить (удалить) переменную $IS_MODIFIED? Или она сама обнулится/удалится? Ведь, тогда если в одной папке есть изменения, то переменную надо обнулить/удалить для других папок... Или делать перед циклом SET $IS_MODIFIED=0, а потом проверять не IF NO DEFINED, а IF $IS_MODIFIED=1? ![]() |
Последний раз редактировалось frid-karatel, 08-05-2011 в 22:08. Отправлено: 22:02, 08-05-2011 | #15 |
Ветеран Сообщения: 1758
|
Цитата frid-karatel:
set "dir=C:\ParentFolder\ChildFolder\SomeChildFolder\" set "backup=S:\Backup\%computername%\%dir::=%" Цитата frid-karatel:
Цитата frid-karatel:
|
|||
Отправлено: 22:16, 08-05-2011 | #16 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Не получается... Пытаюсь как-то адаптировать, но не могу
![]() Foreigner, алгоритм получения даты самого последнего файла не совсем подходит... Дело в том, что в папке с резервными копиями может появиться файл Thumbs.db, у которого дата изменения будет позже, чем у последней копии, вследствие чего будет "неправильность" ![]() Как узнать дату самую последнюю дату изменения RAR файла в папке? И... почему-то этот код выдаёт слово "Том" вместо даты... |
Последний раз редактировалось frid-karatel, 08-05-2011 в 23:59. Отправлено: 23:43, 08-05-2011 | #17 |
Ветеран Сообщения: 1758
|
Цитата frid-karatel:
Добавь что выделено зеленым Цитата:
|
||
Отправлено: 01:13, 09-05-2011 | #18 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата Foreigner:
- переход по метке не способен обеспечить прерывание цикла; - обычный IF успешно её заменит и без всякой "путаницы"; - ну и как водится, пара вариантов: |
|
Последний раз редактировалось amel27, 09-05-2011 в 13:17. Причина: очепятка Отправлено: 10:14, 09-05-2011 | #19 |
Ветеран Сообщения: 1758
|
|
Последний раз редактировалось Foreigner, 09-05-2011 в 11:44. Отправлено: 11:38, 09-05-2011 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Нужно найти все файлы *.log в папке dir и подпапках и заменить на файлы нулевой длины | dclxvi | Скриптовые языки администрирования Windows | 4 | 04-07-2012 21:28 | |
Любой язык - Нужно быстро (!) добавить/удалить строку во все файлы указанной директории | Possessed | Скриптовые языки администрирования Windows | 6 | 04-10-2011 22:29 | |
CMD/BAT - [решено] две функции по mp3 (узнать продолжительность и найти все mp3 файлы в папке) | tor4ok11 | Скриптовые языки администрирования Windows | 5 | 22-11-2010 07:17 | |
Доступ - Доступ через сеть к указанной общей папке | Makcermakcer | Microsoft Windows Vista | 0 | 29-08-2009 23:06 | |
[решено] Найти последние изменённые файлы | hasherfrog | Программирование в *nix | 3 | 22-08-2008 15:32 |
|