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

时间:2012-07-30 20:33:25

标签: windows batch-file

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

我用过

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

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

1 个答案:

答案 0 :(得分: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小时格式)
  • mm =分钟
  • ss = seconds
  • 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%"