Этот пакетный код можно использовать, чтобы узнать, какой файл имеет самую новую дату в имени файла для трех примеров имен файлов:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "NewestFile="
set "NewestDate=0000-00-00"
for %%I in ("file*.doc") do (
set "FileName=%%~nI"
if "!FileName:~-8,1!" == "." (
set "FileDate=!FileName:~-4!-!FileName:~-7,2!-!FileName:~-10,2!"
) else (
set "FileDate=20!FileName:~-2!-!FileName:~-5,2!-!FileName:~-8,2!"
)
echo Date is !FileDate! in file name for file: "%%I"
if "!FileDate!" GTR "!NewestDate!" (
set "NewestDate=!FileDate!"
set "NewestFile=%%I"
)
)
if defined NewestFile (
echo File "%NewestFile%" is the newest with date: %NewestDate%
) else (
echo Could not find any file matching the pattern file*.doc.
)
endlocal
pause
Пакетный файл просто оценивает восьмой символ имени файла без расширения файла с правой стороны (конец имени файла), чтобы определить, имеет ли дата в конце имени файла формат DD.MM.YYYY
, назначенный переменной среды FileDate
в международном формате даты YYYY-MM-DD
или в формате DD.MM.YY
, присвоенном переменной среды, также в международном формате даты YYYY-MM-DD
с использованием 20
в качестве столетия с использованием подстановок строк.
Затем эта строка даты сравнивается с учетом регистра со строкой даты самого нового файла. Если один символ в строке даты текущего файла больше, чем тот же символ в текущей строке даты, текущий файл имеет более новую дату, чем текущий новый файл. Большим преимуществом использования международного формата даты является то, что сравнение строк можно использовать для определения, какая дата является более новой или более старой.
Пакетный файл выше не работает для имен файлов, содержащих один или несколько !
. Командная строка set "FileName=%%~nI"
перед выполнением анализируется дважды командным процессором Windows из-за включенного отложенного расширения переменной среды. См. Также Как синтаксический анализ сценариев интерпретатора команд Windows (CMD.EXE)? Поэтому каждый восклицательный знак в имени файла интерпретируется как начало / конец ссылки на задержанную переменную среды, что приводит к присвоению имени файла с помощью !
не соответствует переменной среды.
Одним из решений для рабочего кода для имен файлов с восклицательными знаками не является использование отложенного расширения с помощью подпрограммы:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "NewestFile="
set "NewestDate=0000-00-00"
for %%I in ("file*.doc") do call :ProcessFileName "%%I"
if defined NewestFile (
echo File "%NewestFile%" is the newest with date: %NewestDate%
) else (
echo Could not find any file matching the pattern file*.doc.
)
endlocal
pause
goto :EOF
:ProcessFileName
set "FileName=%~n1"
if "%FileName:~-8,1%" == "." (
set "FileDate=%FileName:~-4%-%FileName:~-7,2%-%FileName:~-10,2%"
) else (
set "FileDate=20%FileName:~-2%-%FileName:~-5,2%-%FileName:~-8,2%"
)
echo Date is %FileDate% in file name for file: %1
if "%FileDate%" GTR "%NewestDate%" (
set "NewestDate=%FileDate%"
set "NewestFile=%~1"
)
goto :EOF
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
call /?
echo /?
endlocal /?
for /?
goto /?
if /?
pause /?
set /?
setlocal /?
См. Также Куда возвращается GOTO: EOF?