Пакетное: Копирование файлов, которые были изменены за 15 минут до - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть папка, в которой файлы создаются автоматически, и мне нужно каждые 5 минут копировать новые файлы (то есть файлы, последнее изменение которых было за последние 5 минут).

 :loop
for %a in (C:\test\*) do (
 set FileDate=%~ta
)
 timeout /t 300
 goto loop

Я нашел способ получить дату файла, но я не знаю, как сравнить и получить текущую дату меньше 5 минут.

(Команда копирования не нужна, поскольку выполняется через SSH, и эта проблема решена).

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Это совершенно другое решение, в результате которого, скорее всего, будет то же самое поведение с тем преимуществом, что дата последнего изменения файла на самом деле не имеет значения. Таким образом, если файл копируется в наблюдаемую папку, он также обрабатывается, даже если его последнее время изменения не находится в пределах последних 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 /?
0 голосов
/ 08 ноября 2018

В пакетных вычислениях даты и времени очень утомительная задача.

Я предлагаю использовать PowerShell (хотя бы в качестве инструмента)

Получить файлы, созданные в текущем каталоге за последние 5 минут.
Эта команда powershell выведет dir -подобный листинг:

Get-ChildItem -Path 'X:\path'|Where-Object {((Get-Date) - $_.LastWriteTime).TotalMinutes -le 5}

Чтобы ограничить это только FullName, вы можете добавить канал

| Select-Object -ExpandProperty FullName

или просто заключите команду в скобки и добавьте (...). FullName

(Get-ChildItem -Path 'X:\path'|Where-Object {((Get-Date) - $_.LastWriteTime).TotalMinutes -le 5}).FullName

Завернут в партию

:: Q:\Test\2018\11\08\SO_53206386.cmd
@Echo off
for /f "usebackq delims=" %%A in (`
  powershell -Nop -C "(Get-ChildItem -Path 'X:\path' -File |Where-Object {((Get-Date) - $_.LastWriteTime).TotalMinutes -le 15}).FullName"
`) Do Echo %%A

Пример вывода этой партии (сам список)

> SO_53206386.cmd
Q:\Test\2018\11\08\SO_53206386.cmd

Для параметра -File требуется PowerShell v3 +, но его можно заменить другой конвейерной командой

| Where-Object {!($PSISContainer)}

фильтрация папок. (Наоборот -Directory или нет ! для не)

@Echo off
for /f "usebackq delims=" %%A in (`
  powershell -Nop -C "(Get-ChildItem -Path 'X:\path' | Where-Object {!($PSISContainer)}| Where-Object {((Get-Date) - $_.LastWriteTime).TotalMinutes -le 15}).FullName"
`) Do Echo %%A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...