如何在Windows命令行上获取文件的上次修改日期?

时间:2010-01-21 17:24:09

标签: windows batch-file command

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

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

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

9 个答案:

答案 0 :(得分:35)

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

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

答案 1 :(得分:11)

你可以做到

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

答案 2 :(得分:6)

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

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:?
)

答案 3 :(得分:3)

要以与语言环境无关的方式获取文件的最后修改日期/时间,可以使用wmic commandDataFile别名:

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

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

这将返回一个标准化的日期/时间值(例如2019年8月12日 th ,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循环避免了第一个wmic循环将伪造的字符(如孤立的回车符)从for /F的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。 / p>

还请查看this postthis one有关如何获取文件和目录日期/时间戳的信息。

答案 4 :(得分:2)

它适用于Vista。有些事要尝试:

  1. find替换为find命令的完全限定路径。 find是一个常见的工具名称。有一个unix发现与Windows内置查找非常不同。像这样:
    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"

  4. 这应该会告诉你需要看什么。

    如果您仍然无法解决这个问题,请编辑您的帖子以包含您从这些命令中看到的内容,并且有人会帮助您。

答案 5 :(得分:1)

您也可以使用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

答案 6 :(得分:1)

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

一些例子:

%N

答案 7 :(得分:0)

(确切地说)在当前目录中提供了什么输出<{1}}?如果设置分隔符会发生什么?

dir myfile.txt

(注意FOR /f "tokens=1,2* delims= " %%a in ('dir myfile.txt^|find /i " myfile.txt"') DO SET fileDate=%%a 之后的空格)
(为了让生活更轻松,您可以通过将delims=替换为%%a来从命令行执行此操作)

答案 8 :(得分:0)

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

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

DIR /T:W myfile.txt

以上命令的输出将产生您可能不需要的各种其他详细信息,因此您可以合并两个FINDSTR命令以删除空行,以及对“ Volume”,“ Directory”和“ bytes”的任何引用: / p>

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

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

这是一个更简洁的命令:

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