Пакет: копировать только файлы новее, чем дата и время

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

Кажется, я не могу найти способ сделать это с помощью пакетного/робокопирования или другого подхода. Любые предложения будут оценены, в идеале не используя powershell (я понимаю, что он, вероятно, может это сделать, но я никогда его не использовал, и кривая обучения пока кажется немного крутой).

Я могу настроить дату/время, сохраненные в файле, чтобы они соответствовали любому формату.

Итак, скажем, дата-время 2016-08-17-18-00-00, тогда

Org\A\1.txt     (2016-08-17-18-01-00) > Target\A\1.txt
Org\A\2.txt     (2016-08-17-17-00-00) > (not copied, as too old)
Org\B\C\D\3.txt (2016-08-18-09-00-00) > Target\B\C\D\3.txt

Мне, вероятно, нужно использовать цикл forfiles, но я не уверен, как учитывать время и дату.


person Nick    schedule 18.08.2016    source источник
comment
у вас такой замечательный формат - вы умеете просто сравнивать строки if "2016-08-17-18-01-00" gtr "2016-08-17-18-00-00" .... Используйте цикл for для обработки файла. for /?, if /?   -  person Stephan    schedule 18.08.2016
comment
Используйте forfiles для создания файла exclude.txt, содержащего все старые имена файлов. Затем передайте это xcopy /EXCLUDE:exclude.txt   -  person FloatingKiwi    schedule 18.08.2016
comment
@FloatingKiwi: forfiles работает только с датами, без времени.   -  person Stephan    schedule 18.08.2016
comment
Да, но он может выводить @ftime, что позволяет фильтровать по нему.   -  person FloatingKiwi    schedule 18.08.2016
comment
Это выглядит полезным! Как заставить forfiles выводить fdate в формате YYYY-MM-DD (или что-то в этом порядке)? Кажется, он производит DD\MM\YYYY, по крайней мере, в моей локали.   -  person Nick    schedule 18.08.2016
comment
Эти предложения звучали многообещающе, но я не мог их сработать. дата + время файла цикла for задается в формате dd/MM/yyyy hh:mm, который я не могу легко сравнить по строкам. И я не вижу способа преобразовать его на лету. Forfiles работает по датам, и я не вижу способа фильтровать по времени.. может быть, вы можете объяснить, что вы имеете в виду? С forfiles я тоже не могу копировать файлы определенной даты, только от и новее или от и старше... Любые дальнейшие / более подробные предложения?   -  person Nick    schedule 19.08.2016


Ответы (1)


@echo off
setlocal enabledelayedexpansion
set compare=201608171800

for /r %%F in (*) do (
  set file=%%~fF
  for /f "tokens=2 delims=.=" %%I in ('wmic datafile where name^="!file:\=\\!" get lastmodified /format:list') do (
   if "%%I" geq "%compare%" for /f "tokens=2,* delims=\" %%A in ("%%~fF") do echo %%~fF -- N:\target\%%B
  )
)

возможно, вам придется адаптировать «2» в tokens=2,* к вашим потребностям.

Примечание: это медленно, из-за wmic
из-за сравнения строк это работает с форматом %compare% YYYYMMDDhhmmss или YYYYMMDDhhmm или даже YYYY.

person Stephan    schedule 19.08.2016
comment
Спасибо. Если кто-то смотрит на это и знает чистый пакетный способ сделать это, я был бы очень признателен. Хотя его может просто не быть. - person Nick; 17.10.2016
comment
Я имел в виду без WMIC. - person Nick; 20.10.2016
comment
да - вы можете использовать dir /tw, но это будет зависеть от настроек локали (формат даты), и вам придется добавить много кода для переформатирования в сопоставимый формат (ГГГГ-ММ-ДД). Лучше использовать wmic или даже не пакетные утилиты, такие как powershell, java или vbs (все они должны быть доступны при стандартной установке Windows и могут вызываться из пакета) - person Stephan; 20.10.2016