Как узнать, какой файл является самым новым в каталоге по дате в конце имени файла в формате ДД.ММ.ГГ или ДД.ММ.ГГГГ? - PullRequest
0 голосов
/ 28 августа 2018

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

file name 27.08.18.doc с одним, созданным еженедельно в начале недели.

В данный момент мой каталог содержит, например, файлы file name 06.08.18.doc, file name 13.08.2018.doc и file name 20.08.2018.doc.

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

setlocal enabledelayedexpansion
set max=0
for %%x in (file*.doc) do (
    set "FN=%%~nx"
    set "FN=!FN:file name =!"
    if !FN! GTR !max! set max=!FN!
)
echo highest version: file name %max%.doc

Как только я получу эту переменную %max%, чтобы указать день или дату самого последнего файла (27 в примере), я могу работать с этим сам. Я надеюсь, что кто-то может дать ответ и объяснить, что делает команда, чтобы помочь мне одновременно изучить и исправить мою проблему.

1 Ответ

0 голосов
/ 28 августа 2018

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

@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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...