Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Найти, есть ли в папке (и подпапках) изменённые файлы с указанной даты

Ответить
Настройки темы
CMD/BAT - [решено] Найти, есть ли в папке (и подпапках) изменённые файлы с указанной даты

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


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

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


Доброго времени суток!

Возник вопрос...
Как можно средствами BAT-файла найти, есть ли изменённые файлы в указанной папке (включая подкапки)?

Вкратце опишу, для чего мне это необходимо:
1. Указываю папку через SET $DEST_DIR=C:\Documents
2. Затем скрипт проверяет, есть ли в папке изменившиеся файлы (хотя бы один)
3. Если есть хотя бы один изменённый файл, то скрипт запускает WinRAR из консоли и делает т.н. резервную копию всей папки
4. Затем созданный архив перемещает на сетевой диск...

Отправлено: 18:41, 08-05-2011

 

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


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

Профиль | Отправить 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
Благодарности: 966

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


Цитата frid-karatel:
Или вместо i можно использовать f, g и вообще, любую другую букву? »
Можно любую -- 0-9, a-z, а-я и всякие #, $, [, ].... Но обычно начинают с %%a или с %%i ( просто по традиции )

Например:
Код: Выделить весь код
for /f "tokens=1-3" %%а in ("1 2 3") do echo %%а %%б %%в
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:31, 08-05-2011 | #12


Ветеран


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

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


Foreigner, спасибо, интересное замечание.

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


Ветеран


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

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


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
Благодарности: 0

Профиль | Отправить 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
Благодарности: 966

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


Цитата frid-karatel:
Как из пути "C:\ParentFolder\ChildFolder\SomeChildFolder\" получить путь "S:\Backup\C\ParentFolder\ChildFolder\SomeChildFolder"? »
Код: Выделить весь код
set "dir=C:\ParentFolder\ChildFolder\SomeChildFolder\"
set "backup=S:\Backup\%computername%\%dir::=%"
Цитата frid-karatel:
Как получить дату создания самого нового файла в папке? »
Код: Выделить весь код
for /f "tokens=*" %%i in (' dir /b /od /a-d /tc ') do set "newest_file=%%i"
Цитата frid-karatel:
Как обнулить (удалить) переменную $IS_MODIFIED? »
Код: Выделить весь код
...

:@check
set "$IS_MODIFIED="
...
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:16, 08-05-2011 | #16


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


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

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


Не получается... Пытаюсь как-то адаптировать, но не могу

Foreigner, алгоритм получения даты самого последнего файла не совсем подходит...
Дело в том, что в папке с резервными копиями может появиться файл Thumbs.db, у которого дата изменения будет позже, чем у последней копии, вследствие чего будет "неправильность"
Как узнать дату самую последнюю дату изменения RAR файла в папке?

И... почему-то этот код выдаёт слово "Том" вместо даты...
Код: Выделить весь код
:: >> Поиск изменённых файлов
:@check
SET $IS_MODIFIED=
FOR /f "tokens=1-3 delims=." %%i IN ("%1") DO (
	IF %%k%%j%%i geq !$LAST_MODIFIED! (
		SET $IS_MODIFIED=1
		ECHO %%k%%j%%i
	)
)
GOTO:eof
:: << << <<

Последний раз редактировалось frid-karatel, 08-05-2011 в 23:59.


Отправлено: 23:43, 08-05-2011 | #17


Ветеран


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

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


Цитата frid-karatel:
И... почему-то этот код выдаёт слово "Том" вместо даты... »
Это не тот, a этот:
Код: Выделить весь код
	FOR /f "tokens=1" %%i IN ('DIR /s /tw /a-d ^| findstr /b "[0-9]"') DO (
Добавь что выделено зеленым
Цитата:
Как узнать дату самую последнюю дату изменения RAR файла в папке?
значит ищи только *.rar
Код: Выделить весь код
for /f "tokens=*" %%i in (' dir /b /od /a-d /tc *.rar ') do set "newest_rar=%%i"
Это сообщение посчитали полезным следующие участники:

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


Googler


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

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


Цитата Foreigner:
По поводу меток. Два варианта для исследований »
то, что это может работать не отменяет исходного утверждения Iska ;)
- переход по метке не способен обеспечить прерывание цикла;
- обычный IF успешно её заменит и без всякой "путаницы";
- ну и как водится, пара вариантов:
читать дальше »

Код: Выделить весь код
@echo off
SETLOCAL EnableDelayedExpansion

set $i=100
for /l %%i in (0,0,1) do ( set/a $i-=1
    if !$i! lss 0 goto:break
    set/p .=.<nul

   rem
)
:break
echo ---
Код: Выделить весь код
@echo off

for /l %%i in (0,1,10) do (

    if %%i equ 2 goto:break
    :break
    echo %%i

)
echo ---

Последний раз редактировалось amel27, 09-05-2011 в 13:17. Причина: очепятка


Отправлено: 10:14, 09-05-2011 | #19


Ветеран


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

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


В бесконечном цикле походу goto вообще не работает, даже goto:eof, только exit
Код: Выделить весь код
@echo off
setlocal enabledelayedexpansion

set "n=10"
for /l %%i in (0,0,1) do (

    set /a n-=1
    0>nul set /p="!n!,"
    if !n! leq 0 echo end && 1>nul pause && exit 


)

Последний раз редактировалось Foreigner, 09-05-2011 в 11:44.


Отправлено: 11:38, 09-05-2011 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Найти, есть ли в папке (и подпапках) изменённые файлы с указанной даты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход