Это совершенно другое решение, в результате которого, скорее всего, будет то же самое поведение с тем преимуществом, что дата последнего изменения файла на самом деле не имеет значения. Таким образом, если файл копируется в наблюдаемую папку, он также обрабатывается, даже если его последнее время изменения не находится в пределах последних X минут. Он использует атрибут файла архива, установленный Windows, автоматически каждый раз, когда файл создается в папке или файл изменяется процессом.
@echo off
set "Folder=C:\test"
:loop
for /F "eol=| delims=" %%I in ('dir "%Folder%\*" /AA-D-H /B /ON 2^>nul') do (
%SystemRoot%\System32\attrib.exe -a "%Folder%\%%I"
echo Copy the file "%Folder%\%%I"
)
%SystemRoot%\System32\timeout.exe /T 300
goto loop
Команда FOR выполняет следующую командную строку в отдельном командном процессе, запущенном с cmd.exe /C
в фоновом режиме.
dir "C:\test\*" /AA-D-H /B /ON 2>nul
Команда DIR выводит
- в голом формате только имя файла и расширение файла из-за
/B
- только не скрытые файлы с установленным атрибутом архива из-за
/AA-D-H
- упорядочено по имени файла из-за
/ON
(на самом деле не нужно)
- найдено в каталоге
C:\test
соответствующий шаблон подстановки *
.
Сообщение об ошибке, выводимое DIR при обнаружении какой-либо записи каталога, соответствующей этим требованиям, подавляется путем перенаправления ее с дескриптора STDERR на устройство NUL .
Прочитайте статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul
. Оператор перенаправления >
должен быть экранирован с помощью символа вставки ^
в FOR командной строке, чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , которая выполняет встроенную командную строку dir
в отдельном командном процессе, запущенном в фоновом режиме.
Этот вывод DIR в отдельном командном процессе записывается FOR и обрабатывается построчно.
Пустые строки всегда пропускаются FOR , которые здесь не встречаются.
Строки (имена файлов), начинающиеся с точки с запятой, также по умолчанию пропускаются FOR . Это поведение отключается изменением с eol=|
символа конца строки со значения по умолчанию ;
на вертикальную черту, которую нигде не может содержать имя файла.
FOR по умолчанию разделяет строку в подстроках (токенах), используя пробел / табуляцию в качестве разделителей, и присваивает только первую строку с пробелом / табуляцией в виде указанной переменной цикла I
. Такое поведение здесь нежелательно, поскольку имена файлов могут содержать один или несколько пробелов. По этой причине delims=
используется для указания пустого списка разделителей, который отключает разделение строк.
Таким образом, переменной цикла присвоено I
- это имя файла с расширением файла, выводимое DIR без пути.
Команда ATTRIB используется для удаления атрибута архива из текущего файла для следующей итерации цикла FOR . Затем файл можно скопировать в другое место или обработать иным образом, не изменяя его содержимое.
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
attrib /?
dir /?
echo /?
for /?
goto /?
timeout /?