首页 > 解决方案 > 我正在尝试获取 Logs 文件夹中最近修改的文件的日期和时间(在变量上),但总是出现错误

问题描述

我正在尝试获取 Logs 文件夹中最近修改的文件的日期和时间(在变量上),但我总是收到错误消息(“此时出乎意料。”)

我正在使用以下代码:

@echo off
SETLOCAL

for /f %%G in ('dir .\Logs /b/a-d/o-d/t:w') do (
    if not defined NewestFileTime (
        set NewestFileTime=%%~tG
    ) else (
        if %NewestFileTime% GTR %%~tG set NewestFileTime=%%~tG
    )
)

if not defined NewestFileTime (
    echo There is no file in current directory.
    goto :exit
)

echo Last file modification time is: %NewestFileTime%

:exit
endlocal
echo.
echo Press CTRL+C to exit
pause

标签: batch-file

解决方案


您的脚本中有许多重叠的错误:

  • 由于代码块,您需要启用延迟扩展。
  • 您在比较中使用了错误的运算符。
  • 您必须在比较中引用字符串。

在比较字符串(尤其是表示数字的字符串)时,您应该始终注意的一件事是,比较是基于您配置的语言的代码点。所以"2019-1-1" < "2019-01-01"由于字符串的长度不同。但是可以比较使用相同格式的日期/时间字符串,当且仅当它们遵守完整的YYYY-MM-DDhh:mm am|pm格式时。

这是您的固定代码:

@echo off
setlocal EnableExtensions EnableDelayedExpansion

for /f %%G in ('dir .\Logs /b/a-d/o-d/t:w') do (
    if not defined NewestFileTime (
        set NewestFileTime=%%~tG
    ) else (
        if "!NewestFileTime!" LSS "%%~tG" set NewestFileTime=%%~tG
    )
)

if not defined NewestFileTime (
    echo There is no file in current directory.
    goto :exit
)

echo Last file modification time is: %NewestFileTime%

:exit
endlocal
echo.
echo Press CTRL+C to exit
pause

在我的系统上针对此目录进行了测试:

Directory of D:\TMP\test\Logs

2020-02-04  11:37 AM    <DIR>          .
2020-02-04  11:37 AM    <DIR>          ..
2020-01-16  02:07 AM               135 fqpnTest.cmd
2020-02-04  11:32 AM               578 test.cmd
2020-02-04  11:37 AM                15 test.txt
               3 File(s)            728 bytes

结果是:

> test
Last file modification time is: 2020-02-04 11:40 AM

Press CTRL+C to exit
Press any key to continue . . .

明显的时间差异是由于我的创建时间不等于我上次更新时间的事实造成的。


推荐阅读