如何在 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
分别替换为CreationDate
或LastAccessed
。要获取有关目录而不是文件的信息,请使用别名 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?