繁体   English   中英

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

[英]How to get last modified date on Windows command line for a set of files?

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

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

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

%更改为%%以在批处理文件中使用,对于%~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=

你能行的

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

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

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

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

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

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

这将返回这样的标准化日期/时间值(意味着 2019 年 8 月 12,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 文本时的人工制品(如孤立的回车字符)(另请参阅此答案)。

然后,您可以使用子字符串扩展来从中提取纯日期或时间:

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

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

要指定包含,)文件(或目录)路径/名称, wmic通常不接受,请查看此问题

退房还这篇文章以及这一个有关如何获取文件和目录的日期/时间戳记。

它在 Vista 上对我有用。 一些尝试:

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

这应该会显示您需要查看的内容。

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

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

您可以尝试与 DIR 命令关联的“上次写入”时间选项

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

DIR /T:W myfile.txt

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

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

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

这是一个更清晰的命令:

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

如果您能够引入 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

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

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

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

使用 PowerShell 获取具体的日期格式:

for /f "usebackq" %d in (`powershell "(get-item \"Rar.exe\").lastWriteTime.toString(\"yyyy-MM-dd\")"`) do ( echo ren "Rar.exe" "%d_rar550.exe" )
rem

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM