如何根据日期以文件名结尾的日期(DD.MM.YY或DD.MM.YYYY)找出目录中的最新文件?

时间:2018-08-28 15:03:16

标签: batch-file

我需要编写批处理文件来打开文件夹中每周更新一次的目标文件中的最新文件的帮助。该文件还具有其他功能,但是我正在努力这部分。文件格式如下:

file name 27.08.18.doc,每周初创建一个。

目前,我的目录中包含文件file name 06.08.18.docfile name 13.08.2018.docfile 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 :(得分:0)

此批处理代码可用于找出哪个文件的三个示例文件名的文件日期最新:

@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命令处理器在执行之前对命令行!进行了两次解析。另请参见How does the Windows Command Interpreter (CMD.EXE) parse scripts?,因此,文件名中的每个感叹号都将被解释为延迟的环境变量引用的开始/结尾,从而导致使用@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 /?
  • With Range("OTBTota") .FormulaR1C1 = "=R[-1]C/R[10]C" .Value2 = .Value2 End With

另请参阅Where does GOTO :EOF return to?