Как я сравниваю метки времени файлов в сценарии пакетной обработки?

Я нашел решение. Для завершения forkjoin необходимо завершить все наблюдаемые. В моем случае наблюдаемое в uploadService не было завершено. После того, как я отправил сообщение «Complete», я смог получить ответ.

28
задан aschipfl 16 January 2019 в 10:26
поделиться

3 ответа

Вы можете найти более новый из двух файлов с помощью одной строки пакетного сценария. Просто укажите файлы в порядке дат, сначала самые старые, что означает, что последний файл в списке должен быть более новым. Поэтому, если вы сохраняете имя файла каждый раз, последнее имя, указанное в вашей переменной, будет самым новым файлом.

Например:

SET FILE1=foo.txt
SET FILE2=bar.txt
FOR /F %%i IN ('DIR /B /O:D %FILE1% %FILE2%') DO SET NEWEST=%%i
ECHO %NEWEST% is (probably) newer.

Это, к сожалению, не справляется с одинаковыми отметками даты. Поэтому нам просто нужно сначала проверить, имеют ли файлы одинаковые отметки даты и времени:

SET FILE1=foo.txt
SET FILE2=bar.txt

FOR %%i IN (%FILE1%) DO SET DATE1=%%~ti
FOR %%i IN (%FILE2%) DO SET DATE2=%%~ti
IF "%DATE1%"=="%DATE2%" ECHO Files have same age && GOTO END

FOR /F %%i IN ('DIR /B /O:D %FILE1% %FILE2%') DO SET NEWEST=%%i
ECHO Newer file is %NEWEST%

:END
33
ответ дан 28 November 2019 в 02:52
поделиться

Я использовал бы xcopy для этого:

xcopy /L /D /Y PATH_TO_FILE1 PATH_TO_FILE2|findstr /B /C:"1 " && echo FILE1 is newer!

, поскольку xcopy всегда возвращает true в этом случае, необходимо отфильтровать его вывод с командой findstr.

  • /L для списка только, ничто не копируется.
  • /D делает сравнение времени. Подсказка: Путем свопинга File1 и File2 можно решить, как обработать идентичные файлы.
  • /Y в только необходимом для предотвращения 'Перезаписи существующий' вопрос.

Это - все, и это работает с различными путями.

1
ответ дан 28 November 2019 в 02:52
поделиться

серьезно, тебе стоит начать изучать кое-что еще. Это не шутка. DOS (cmd.exe) серьезно не хватает возможностей манипулирования датами и многих других недостатков. Вот следующая лучшая альтернатива, изначально предоставляемая помимо пакета DOS, vbscript

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strFile1 = objArgs(0)
strFile2 = objArgs(1)
Set objFile1 = objFS.GetFile(strFile1)
Set objFile2 = objFS.GetFile(strFile2)
If objFile1.DateLastModified < objFile2.DateLastModified Then
    WScript.Echo "File1: "&strFile1&" is older than "&strFile2
Else
    WScript.Echo "File1: "&strFile1&" is newer than "&strFile2
End If 

запускать ее из командной строки

C:\test>dir
 Volume in drive C has no label.
 Volume Serial Number is 08AC-4F03

 Directory of C:\test

11/06/2009  07:40 PM    <DIR>          .
11/06/2009  07:40 PM    <DIR>          ..
11/06/2009  06:26 PM               135 file
11/02/2009  04:31 PM             4,516 m.txt

C:\test>cscript /nologo test.vbs file m.txt
File1: file is newer than m.txt

Конечно, в более новых версиях Windows вы можете попробовать Powershell ...

8
ответ дан 28 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: