Эта команда выводит список файлов, упорядоченных по времени модификации. Последний - последний.
> dir /Od /B
Эта команда запускает предыдущий файл и сохраняет последний файл в переменной FILE
> for /F "usebackq" %f in (`dir /Od /B`) do set "FILE=%f"
Эта команда показывает информацию о файле для определенного файла:
> dir /N "%FILE%" | findstr /B "[0-9]"
Эта команда запустит предыдущую команду и проанализирует ее. Порядок полей (год, месяц, день ...) и разделителей (/ для даты, для часа в моем случае) зависит от ваших региональных настроек.
> for /f "usebackq tokens=1-5 eol=\ delims=/:\ " %i in (`dir /N "%FILE%" ^| findstr /B "[0-9]"`) do echo [%i%j%k] [%l%m]
Мы можем сохранить результат в переменных:
> for /f "usebackq tokens=1-5 eol=\ delims=/:\ " %i in (`dir /N "%FILE%" ^| findstr /B "[0-9]"`) do set DD=%i&set MM=%j&set YYYY=%k&set HH=%l&set MI=%m
Эти команды показывают текущую дату и время:
> date /t
> time /t
Эти команды запускаются, анализируются и сохраняются в переменные:
> for /F "usebackq tokens=1-3 delims=%DATE_DELIM%" %i in (`date /t`) do set DD=%i&set MM=%j&set YYYY=%k
> for /F "usebackq tokens=1,2 delims=%TIME_DELIM%" %i in (`time /t`) do set HH=%i&set MI=%j
Это была легкая часть. Теперь мы должны сделать некоторую арифметику, чтобы сравнить даты. set /A
может выполнять арифметику, но интерпретирует "08" как восьмеричное. Таким образом, мы должны преобразовать значения в десятичную, удалив начальный «0»:
> set /A DD=1%DD%-100&set /A MM=1%MM%-100
> set /A HH=1%HH%-100&set /A MI=1%MI%-100
Вот последний сценарий.
Мне пришлось использовать много приемов для арифметики даты / времени, поэтому «24h» жестко запрограммирован.
@echo off
setlocal
set DIR=%~f1
set DATE_DELIM=/
set TIME_DELIM=:
for /F "usebackq" %%f in (`dir /Od /B "%DIR%"`) do set "FILE=%%f"
for /F "usebackq tokens=1-5 eol=\ delims=%DATE_DELIM%%TIME_DELIM%\ " %%i in (`dir /N "%FILE%" ^| findstr /B "[0-9]"`) do set A_DD=%%i&set A_MM=%%j&set A_YYYY=%%k&set A_HH=%%l&set A_MI=%%m
set A_DATE=%A_YYYY%%A_MM%%A_DD%
set /A A_DD=1%A_DD%-100&set /A A_MM=1%A_MM%-100
set /A A_TIME=(1%A_HH%-100)*60+%A_MI%-100
for /F "usebackq tokens=1-3 delims=%DATE_DELIM%\ " %%i in (`date /t`) do set B_DD=%%i&set B_MM=%%j&set B_YYYY=%%k
for /F "usebackq tokens=1,2 delims=%TIME_DELIM%\ " %%i in (`time /t`) do set B_HH=%%i&set B_MI=%%j
set B_DATE=%B_YYYY%%B_MM%%B_DD%
set /A B_DD=1%B_DD%-100&set /A B_MM=1%B_MM%-100
set /A B_TIME=(1%B_HH%-100)*60+%B_MI%-100
echo %A_DATE% %A_TIME% - %A_YYYY% %A_MM% %A_DD%
echo %B_DATE% %B_TIME% - %B_YYYY% %B_MM% %B_DD%
:: Check that the file is newer than 24 hours
:: This will not work at daylight change
:: This is probably full of bugs as I had no time to test all cases
if %A_DATE% GEQ %B_DATE% goto :NewFile
:: Past day
:: Whatever the day, if the time of the day is <, this is old
if %A_HH%%A_MI% LSS %B_HH%%B_MI% goto :OldFile
if not %B_MM%==1 goto :WhateverMonth
if %A_DATE:~1,6% EQU %B_DATE:~1,6% goto :SameMonth
:: Change Month
set /A D=%B_YYYY%*12+%B_MM%-%A_YYYY%*12+%A_MM%
if not %D%==-1 goto :OldFile
:LastMonth
:: Is A the last day of the month => yesterday ?
if %A_DD% EQU 2 goto :February
:: 31 is of course the last day
if %A_DD% EQU 31 goto :NewFile
if %A_DD% LSS 30 goto :OldFile
:: Months of 30 days
if %A_DD%==4 goto :NewFile
if %A_DD%==6 goto :NewFile
if %A_DD%==9 goto :NewFile
if %A_DD%==11 goto :NewFile
:: Day is 30 and month has 31 days
goto :OldFile
:February
set /A D=28+!(%A_YYYY% ^% 4)
if %A_DD%==%D% goto :NewFile
:: We do not have to handle others bissextile case which will happen in about
:: 389 years
goto :OldFile
:WhateverMonth
if %A_YYYY%%A_MM% EQU %B_YYYY%%B_MM% goto :SameMonth
goto :OldFile
:SameMonth
set /A D=100+%B_DD%-%A_DD%
if %D% GTR 101 goto :OldFile
:Yesterday
if %B_DD% GTR 1 goto :ChkTime
:ChkTime
:OldFile
echo %FILE% is old.
goto :End
:NewFile
echo %FILE% is new.
goto :End
:End
endlocal
Для запуска:
> CheckFile.cmd <directory>
Это было только для того, чтобы показать вам, что возможно . Но я бы не рекомендовал запускать его в производство перед всесторонним тестированием. И это трудно поддерживать . Поэтому вместо пакета я рекомендую использовать JScript в среде WSH или PowerShell.