如何在 Windows 命令行上获取一组文件的最后修改日期?

Posted

技术标签:

【中文标题】如何在 Windows 命令行上获取一组文件的最后修改日期?【英文标题】:How to get last modified date on Windows command line for a set of files? 【发布时间】:2011-01-07 20:30:06 【问题描述】:

我一直在使用以下命令来获取文件日期。但是,自从我们移至另一台服务器 (Windows Server 2003) 后,fileDate 变量一直返回空白值。

FOR /f %%a in ('dir myfile.txt^|find /i " myfile.txt"') DO SET fileDate=%%a 

还有其他更可靠的方法来获取文件日期吗?

【问题讨论】:

【参考方案1】:

% 更改为%% 以便在批处理文件中使用,对于%~ta 语法输入call /?

for %a in (MyFile.txt) do set FileDate=%~ta

示例输出:

for %a in (MyFile.txt) do set FileDate=%~ta
set FileDate=05/05/2020 09:47 AM

for %a in (file_not_exist_file.txt) do set FileDate=%~ta
set FileDate=

【讨论】:

+1。这实际上是正确的。解析dir 的输出充其量是精神错乱。旁注:在批处理文件中,将% 符号加倍。 谢谢,还有一个问题:如何获取日期部分。以下语法是否足够可靠或有更好的方法。设置 FileDate=%FileDate:~0,10% 如果您更改国际设置可能无法正常工作,否则应该可以 你能告诉我这里实际发生了什么吗?我不确定我是否理解 %~ta 或 %a 是什么 对我来说无论做什么,结果都是空白。默认英语美国。【参考方案2】:

你可以的

forfiles /M myfile.txt /C "cmd /c echo @fdate @ftime"

【讨论】:

此语言环境是否依赖? 酷,不知道有forfiles - 比网络上所有神秘的for 示例更直观。 这包括秒,其中 ~t 仅精确到分钟。 Powershell 还通过两部分命令提供秒数:$myFileInfo = Get-Item C:\myPath\myFile.txt$myFileInfo.LastWriteTime 嗯...如何在批处理文件中设置/获取这些日期变量?【参考方案3】:

使用批处理文件获取文件属性的有用参考,包括最后修改时间:

FOR %%? IN ("C:\somefile\path\file.txt") DO (
    ECHO File Name Only       : %%~n?
    ECHO File Extension       : %%~x?
    ECHO Name in 8.3 notation : %%~sn?
    ECHO File Attributes      : %%~a?
    ECHO Located on Drive     : %%~d?
    ECHO File Size            : %%~z?
    ECHO Last-Modified Date   : %%~t?
    ECHO Drive and Path       : %%~dp?
    ECHO Drive                : %%~d?
    ECHO Fully Qualified Path : %%~f?
    ECHO FQP in 8.3 notation  : %%~sf?
    ECHO Location in the PATH : %%~dp$PATH:?
)

【讨论】:

如何使用或实现这个?【参考方案4】:

要以独立于语言环境的方式获取文件的最后修改日期/时间,您可以使用 wmic command 和 DataFile 别名:

wmic DataFile where "Name='D:\\Path\\To\\myfile.txt'" get LastModified /VALUE

注意必须提供文件的完整路径,并且所有路径分隔符(反斜杠\)必须在此处加倍。

这会返回像这样的标准化日期/时间值(表示 2019 年 8 月 12th,13:00:00,UTC + 120'):

LastModified=20190812130000.000000+120

要捕获日期/时间值,请使用 for /F,然后您可以使用 set 将其分配给变量:

for /F "delims=" %%I in ('
    wmic DataFile where "Name='D:\\Path\\To\\myfile.txt'" get LastModified /VALUE
') do for /F "tokens=1* delims==" %%J in ("%%I") do set "DateTime=%%K"

第二个for /F 循环通过第一个for /F 循环避免了将wmic 的Unicode 输出转换为ASCII/ANSI 文本的伪影(如孤立的回车字符)(另请参见this answer)。

然后您可以使用sub-string expansion 从中提取纯日期或时间:

set "DateOnly=%DateTime:~0,8%"
set "TimeOnly=%DateTime:~8,6%"

要获取创建日期/时间或上次访问日期/时间,只需将属性LastModified 分别替换为CreationDateLastAccessed。要获取有关目录而不是文件的信息,请使用别名 FSDir 而不是 DataFile

要指定同时包含,) 的文件(或目录)路径/名称,wmic 通常不接受这些路径/名称,请查看this question。

还可以查看this post 和this one,了解如何获取文件和目录的日期/时间戳

【讨论】:

以微秒为单位的精度(又名 0.001 毫秒)【参考方案5】:

它适用于我的 Vista。可以尝试的一些事情:

    find 替换为 find 命令的完全限定路径。 find 是常用的工具名称。有一个与 Windows 内置查找非常不同的 unix 查找。像这样:FOR /f %%a in ('dir ^|%windir%\system32\find.exe /i "myfile.txt"') DO SET fileDate=%%a

    在 cmd.exe 窗口中检查命令的输出。为此,您需要将 %% 替换为 %。FOR /f %a in ('dir ^|c:\windows\system32\find.exe /i "myfile.txt"') DO SET fileDate=%a 这可能会给你一些想法。

    如果显示为空白,则再次在命令提示符下尝试以下操作:

    dir | c:\windows\system32\find.exe /i "myfile.txt"

这应该向您展示您需要查看的内容。

如果您仍然无法从中弄清楚,请编辑您的帖子以包含您从这些命令中看到的内容,有人会帮助您。

【讨论】:

我的声明和(第 1 步和第 2 步)在我的计算机和任何其他我可以使用的 win server 2003 上工作。这可能是它在服务 ID 下运行并由调度程序触发的问题吗? 是的,它可能是。对于不同的服务 ID,查找程序可能会有所不同,因为它具有不同的路径。最好在服务 ID 下运行这些命令以捕获和检查输出。 几年前,由于命令处理器的语言不同(在我们的例子中,我们的批处理文件在win2000英语和西班牙语中工作),我们在批处理DIR命令的输出时遇到了一些类似的问题,但德语失败)。 英国与美国英语也可能发生!【参考方案6】:

你可以试试“最后写的”time options associated with the DIR command

/T:C -- 创建时间和日期 /T:A -- 上次访问时间和日期 /T:W -- 上次写入的时间和日期(默认)

DIR /T:W myfile.txt

上述命令的输出将产生您可能不需要的各种附加详细信息,因此您可以合并两个 FINDSTR 命令来删除空白行,以及对“卷”、“目录”和“字节”的任何引用:

DIR /T:W myfile.txt | FINDSTR /v "^$" | FINDSTR /v /c:"Volume" /c:"Directory" /c:"bytes"

当结果输出到文本文件时,尝试在单个 FINDSTR 命令中合并空行目标(/c:"^$" 或 "^$")无法删除空行(或产生其他错误) .

这是一个更简洁的命令:

DIR /T:W myfile.txt | FINDSTR /c:"/"

【讨论】:

【参考方案7】:

您也可以使用 vbscript 获取文件修改日期

Set objFS=CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strFile= objArgs(0)
WScript.Echo objFS.GetFile(strFile).DateLastModified

将以上内容另存为 mygetdate.vbs 并保存在命令行中

c:\test> cscript //nologo mygetdate.vbs myfile

【讨论】:

此语言环境是否依赖? @MarkDeven,这与语言环境无关,因为这里涉及到真正的日期/时间数据类型......【参考方案8】:

如果你能引入 EXE,我推荐gdate.exe(来自GNU CoreUtils for Windows)。它可以提供当前日期或文件的日期,有多种不同的格式,并且可以自定义。我使用它来获取文件的最后修改日期时间,我可以在没有任何解析的情况下进行比较(即与本地无关),使用%s(自纪元以来的秒数),可选地使用%N 来获得纳秒精度。

一些例子:

C:\>dir MyFile.txt
02/10/2021  10:54 PM                 4 MyFile.txt

C:\>gdate -r MyFile.txt +%Y-%m-%d
2021-02-10

C:\>gdate -r MyFile.txt "+%Y-%m-%d %H:%M:%S"
2021-02-10 22:54:50

C:\>gdate -r MyFile.txt +%s
1613015690

C:\>gdate -r MyFile.txt +%s.%N
1613015690.093962600

【讨论】:

【参考方案9】:

dir myfile.txt 在当前目录中给出什么输出(确切地说)?如果设置分隔符会怎样?

FOR /f "tokens=1,2* delims= " %%a in ('dir myfile.txt^|find /i " myfile.txt"') DO SET fileDate=%%a 

(注意delims=后面的空格) (为了让生活更轻松,您可以通过将%%a 替换为%a 从命令行执行此操作)

【讨论】:

以上是关于如何在 Windows 命令行上获取一组文件的最后修改日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows 10命令行中获取文件或文件夹的文件ID?

如何在 Windows 命令行上测量命令的执行时间?

在 windows 的命令行上创建一个空文件(如 linux touch 命令)

使用进度在 Windows 命令行上复制文件

在命令行上获取当前年份[重复]

如何防止 qmake 在链接器命令行上添加控制台子系统?