8

我正在尝试编写一个 Windows 命令来列出文件及其最后访问时间,按访问时间排序。

我用过

dir [directory] /O:D /T:A /S /B > output.txt

这会按最后访问时间的顺序输出目录和子目录中的文件;但是我也需要它来输出最后一次访问时间。这是如何实现的?

4

1 回答 1

9

从批处理文件中:

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

但是,您需要注意一些事项:

  • 这些文件按目录中的访问时间戳排序。它不所有目录的访问时间戳排序。您的原始代码有同样的问题。跨目录排序需要解析访问时间戳并将其转换为一个字符串,该字符串将在通过 SORT 排序时按时间顺序排序。类似“yyyy-mm-dd hh24:mm”的东西。即使这样也不是特别好,因为您无法访问秒数。您可以使用 WMIC DATAFILE 列出具有亚秒级最后访问时间戳的文件名。但是,考虑到这一点,为什么要打扰...

  • Windows 维护的最后访问时间戳不可靠!在许多情况下,应用程序可以读取文件,但最后一次访问时间戳并未更新。我在某处看到过一些关于这个的参考资料,但我不记得在哪里。

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

wmic datafile where "drive='c:' and path like '\\test\\%'" get name, lastaccessed | sort

时间戳的格式YYYYMMDDhhmmssddddddZZZZ

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


编辑

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%"
于 2012-07-30T22:03:38.030 回答