Windows Shell命令显示文件名和上次访问时间

mic*_*rke 8 windows batch-file

我正在尝试编写Windows命令来列出文件及其上次访问时间,按访问时间排序.

我用过

dir [directory] /O:D /T:A /S /B > output.txt
Run Code Online (Sandbox Code Playgroud)

这将按照上次访问时间的顺序输出目录和子目录中的文件; 但是我也需要它来输出最后的访问时间.这是如何完成的?

dbe*_*ham 9

从批处理文件中:

>output.txt (
  for /f "delims=" %%F in ('dir /o:d /t:a /s /b "c:\myPath\*"') @echo %%~tF %%F
)
Run Code Online (Sandbox Code Playgroud)

但是,您需要注意以下事项:

  • 文件按目录中的访问时间戳排序.它不是通过跨所有目录的访问时间戳进行排序.您的原始代码有同样的问题.要对目录进行排序,需要解析访问时间戳并将其转换为字符串,该字符串将在通过SORT订购时按时间顺序排序.像"yyyy-mm-dd hh24:mm"之类的东西.即使这样也不是特别好,因为你无法访问秒数.您可以使用WMIC DATAFILE列出具有亚秒级别的上次访问时间戳的文件名.但考虑到......为什么要费心呢?

  • Windows维护的最后一个访问时间戳不可靠!在许多情况下,应用程序可以读取文件,但最后的访问时间戳不会更新.我在某个地方看过一些讨论这个问题的参考资料,但我不记得在哪里.

如果您仍然认为要获取按整个文件夹层次结构的上次访问时间戳排序的文件列表,则以下内容将起作用.假设您要列出"c:\ test \"下的所有文件

wmic datafile where "drive='c:' and path like '\\test\\%'" get name, lastaccessed | sort
Run Code Online (Sandbox Code Playgroud)

时间戳的格式为YYYYMMDDhhmmssddddddZZZZ其中

  • YYYY =年份
  • MM =月
  • DD =天
  • hh =小时(24小时格式)
  • mm =分钟
  • ss =秒
  • dddddd =微秒
  • ZZZZ =时区,表示为与GMT的分钟差异(第1个字符是符号)


编辑

WMIC中的通配符搜索会导致可怕的性能.这是一个版本,它遍历根层次结构中的所有文件夹,针对每个特定文件夹运行WMIC(无通配符).它有不错的表现.

@echo off
setlocal disableDelayedExpansion
set "root=c:\test"
set "output=output.txt"

set "tempFile=%temp%\dir_ts_%random%.txt"
(
  for /d /r "%root%" %%F in (.) do (
    set "folder=%%~pnxF\"
    set "drive=%%~dF"
    setlocal enableDelayedExpansion
    2>nul wmic datafile where "drive='!drive!' and path='!folder:\=\\!'" get name, lastaccessed|findstr /brc:[0-9]
    endlocal
  )
) >"%tempFile%
sort "%tempFile%" >"%output%"
del "%tempFile%"
Run Code Online (Sandbox Code Playgroud)