[英]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
属性分别替换为CreationDate
或LastAccessed
。 要获取有关目录而不是文件的信息,请使用别名FSDir
而不是DataFile
。
要指定包含,
和)
文件(或目录)路径/名称, wmic
通常不接受,请查看此问题。
它在 Vista 上对我有用。 一些尝试:
将find
替换为 find 命令的完全限定路径。 find
是一个常用的工具名称。 有一个 unix find 与 Windows 内置 find 非常不同。 像这样:
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"
这应该会显示您需要查看的内容。
如果您仍然无法从中弄清楚,请编辑您的帖子以包含您从这些命令中看到的内容,有人会帮助您。
您也可以使用 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.