Сравнение измененной даты файла с текущей датой в командном файле - PullRequest
10 голосов
/ 19 февраля 2012

Мне нужно написать командный файл, чтобы сделать несколько вещей

Изначально я думал, что моя проблема очень проста - запишите дату изменения txt-файла, расположенного в указанном каталоге, сравните эту дату с текущей датой и, если они совпадают, сделайте что-нибудь. Если нет, то делай что-нибудь еще.

Строка, которую я использую для захвата текущей даты:

%date%

Строки, которые я использую, чтобы зафиксировать дату изменения моего указанного файла:

SET filename="C:\New Folder\New.txt"
FOR %%f IN (%filename%) DO SET filedatetime=%%~tf
ECHO %filedatetime:~0,-6% >> %destination%

В приведенном выше случае я просто использую echo, чтобы увидеть, что возвращается, и кажется, что дата возвращается, но я получаю дополнительную информацию:

2012/02/19 02

Я хотел бы знать, как получить вышеупомянутые значения, где они сравнимы, а также как правильно их сравнивать.

Ответы [ 3 ]

15 голосов
/ 19 февраля 2012

Работать с датами в пакете намного сложнее, чем должно быть.

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

Эта простая команда выведет список всех файлов, которые были изменены сегодня:

forfiles /m * /d 0

Если найден хотя бы один файл, тогда ERRORLEVEL устанавливается в 0, иначе ERRORLEVEL устанавливается в 1.

У вас есть определенный файл, поэтому вы можете использовать

forfiles /m %filename% /d 0
if %errorlevel% == 0 (
  echo The file was modified today
  REM do whatever else you need to do
) else (
  echo The file has not been modified today
  REM do whatever else you need to do
)

Существует более краткий способ сделать выше,Оператор && используется для условного выполнения команд, если предыдущая команда была успешной, || используется для условного выполнения команд, если предыдущая команда не выполнена.Однако будьте осторожны, команды || также будут выполняться, если команда (ы) && не выполнена.

forfiles /m %filename% /d 0 && (
  echo The file was modified today
  REM do whatever else you need to do
) || (
  echo The file has not been modified today
  REM do whatever else you need to do
)
10 голосов
/ 20 февраля 2012

Мне нравится способ dbenham , но если вы хотите, чтобы ваш код работал, вы можете сделать так:

set currentDate=%date%
SET filename="C:\MyFile.txt"

FOR %%f IN (%filename%) DO SET filedatetime=%%~tf
IF %filedatetime:~0, 10% == %currentDate% goto same

goto notsame

:same
echo Dates the same, do some code here

goto next

:notsame
echo Dates NOT the same, do some code here
goto end

:next

Подумал, стоило бы знать, как заставить свою работу работать на тот случай, если она понадобится вам снова.

2 голосов
/ 24 апреля 2014

Помимо проблем, поднятых в комментариях, прилагаемых к статье TechNet, в которой документируется документация ForFiles ForFiles в Microsoft TechNet , упоминается еще одна проблема, но только если вы читаете между строками о часовом поясеБыть игнорированным.Поскольку ForFiles оценивает измененную дату, указанную по местному времени, он будет обрабатывать файл, измененный в 02: 01 EST , как старше , чем файл, измененный в 02: 59 EDT * 1008.*.

...