在批处理文件中获取文件时间(Windows)

Posted

技术标签:

【中文标题】在批处理文件中获取文件时间(Windows)【英文标题】:Getting file time in a batch file (windows) 【发布时间】:2021-01-16 05:38:11 【问题描述】:

我正在寻找一种方法来检索批处理文件中的文件时间(精确到秒)。我正在尝试对最近修改的所有文件进行操作,而不是另一个文件。

我用过这个方法:

for %%a in (keyfile.dat) do set LAST_PUBLISHED_DATE=%%~ta
rem for %%x in (%LAST_PUBLISHED_DATE:/= %) do echo %%x
for /f "tokens=1,2 delims= " %%a in ("%LAST_PUBLISHED_DATE%") do (
    set DATE=%%a
    set TIME=%%b
    )

for /f "tokens=1,2,3 delims=/" %%a in ("%DATE%") do (
    set MON=000%%a
    set DAY=000%%b
    set YEAR=%%c
    set MON=!MON:~-2,2!
    set DAY=!DAY:~-2,2!
    set YEAR=!YEAR:~-2,2!
    )

for /f "tokens=1,2 delims=:" %%a in ("%TIME%") do (
    set HOUR=000%%a
    set MIN=000%%b
    set HOUR=!HOUR:~-2,2!
    set MIN=!MIN:~-2,2!
    )
set INT_LASTPUBLISHEDDATE=%YEAR%%MON%%DAY%%HOUR%%MIN%

我一直在使用它来将最后修改的日期转换为 int,我可以将其与其他文件进行比较。效果很好。除了有时我可能需要更频繁地运行此批处理而不是每分钟一次。

是否有一些扩展方法可以让我从文件修改时间中获取“秒”?上述方法以 yyyy/mm/dd hh:mm 格式返回。

(最理想的情况是只获取最后一次修改的 unix 时间......但无法找到任何方法来做到这一点!)

谢谢!

【问题讨论】:

DELIMS 选项允许您指定多个分隔符。您不仅限于一个。 无论如何,您都可以像处理 DATE 和 TIME 一样对文件时间进行子串化。 在我看来,基于您有限的信息,您的整个方法似乎有点过于复杂。最简单的方法是执行目录列表,使用Dir 及其/A 选项作为-D,以忽略目录。然后使用/O 选项对它们进行排序,并使用-D 按日期/时间对它们进行排序,以获得最新的优先。将所有这些作为命令包装在For /F 循环中,并输出每个结果,直到返回的文件与您已知的目标文件匹配。一旦匹配,就使用GoTo 命令跳出for-loop。 【参考方案1】:

您可以为此目的利用 vbs。

@Echo Off & Setlocal EnableDelayedExpansion

(For /F "Delims=" %%G in ('TYPE "%~F0" ^| Findstr /BLIC::::') Do (Set "Line=%%G"&Echo/!Line:~3!))>"filetimes.vbs"
For /F "Delims=" %%G in ('cscript //nologo filetimes.vbs %~nx0')Do Set "%%G"
Set %~F0[
Exit /B

:::Set objFSO = CreateObject("Scripting.FileSystemObject") 
:::if WScript.Arguments.Count = 0  Then
:::   WScript.Quit
:::End If

:::strfileFolder = objFSO.GetAbsolutePathName(WScript.Arguments(0)) 

:::'this line only works with cscript
:::Set v = objFSO.GetFile(WScript.Arguments(0))
:::dm=v.DateLastModified
:::dc=v.DateCreated
:::da=v.DateLastAccessed
:::WScript.StdOut.WriteLine(strfileFolder&"[Created]="&dc)
:::WScript.StdOut.WriteLine(strfileFolder&"[Modified]="&dm)
:::WScript.StdOut.WriteLine(strfileFolder&"[Accessed]="&da)

【讨论】:

以上是关于在批处理文件中获取文件时间(Windows)的主要内容,如果未能解决你的问题,请参考以下文章

如何获取windows批处理的父文件夹

windows批处理文件/获取一行中的最后一个单词

Windows Batch - 如何将外部 IP 获取到批处理文件变量中

在 Borland C++ 6 中从 Windows 获取程序文件目录

批处理获取盘符

在 Windows 批处理中获取串行 com 端口描述