【问题标题】:How to get last modified date on Windows command line for a set of files?如何在 Windows 命令行上获取一组文件的最后修改日期?
【发布时间】: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 

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

【问题讨论】:

    标签: windows batch-file command


    【解决方案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 commandDataFile 别名:

    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 postthis one,了解如何获取文件和目录的日期/时间戳。

    【讨论】:

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

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

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

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

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

      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 从命令行执行此操作)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-26
          • 2012-08-07
          • 1970-01-01
          • 1970-01-01
          • 2010-09-17
          • 1970-01-01
          相关资源
          最近更新 更多