Сравнивать дату изменения файла с текущей датой в пакетном файле

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

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

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

%date%

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

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

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

2012/02/19 02

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

3 ответов


Мне нравится 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

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


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

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

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

forfiles /m * /d 0

если найден хотя бы один файл, то ERRORLEVEL имеет значение 0, else 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
)

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

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
)

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