主持人:赢7
我有一个我今天更新的产品(如果你愿意,可以打补丁)。我想具体看到哪些文件被添加到基本安装目录树中。
预期结果仅显示创建时间戳和完整文件路径/名称。我不想看到目录摘要信息或数据中的任何其他中断。输出将是一个非常直观的列表,如下所示:
08/06/2012 11:02 AM c:\my_product_install_path\folder3\new_file_3.xml
08/06/2012 11:01 AM c:\my_product_install_path\folder2\new_file_2.c
08/06/2012 11:01 AM c:\my_product_install_path\new_file_1.h
...
...
我认为从完整安装目录树的自上而下的列表中,我可以通过向下滚动并查找时间早于X的第一个文件来轻松查看旧文件中的新文件。
如何在Windows命令shell(或在cygwin shell中)执行此操作?
“dir / s / b”非常接近但不显示创建时间戳。
您可能认为“dir / s / b / T:C”可以工作,因为/ T:C用于显示创建时间但不是。 / T:C选项不会“覆盖”/ b选项以显示时间戳因此,不知何故,我需要在添加时间戳的情况下获得/ b选项的好处。
答案 0 :(得分:2)
这是命令行的一个繁琐的本机解决方案,但它可以工作: - )
for /d /r %F in (.) do @pushd "%F"&(for /f "eol= delims=" %S in ('2^>nul dir /tc /a-d *') do @for /f "tokens=1-4*" %A in ("%S") do @echo %A %B %C %~fE)&popd
在批处理文件中跨多行格式化时看起来更好。
@echo off
for /d /r %%F in (.) do (
pushd "%%F"
for /f "eol= delims=" %%S in ('2^>nul dir /tc /a-d *') do (
for /f "tokens=1-4*" %%A in ("%%S") do @echo %%A %%B %%C %%~fE
)
popd
)
您可能希望按反向时间顺序对列表进行排序,以便所有新文件都集中在顶部。使用DIR /ODN
选项在每个目录中按时间顺序排序是微不足道的。但是在所有目录中按时间顺序排序是相当棘手的。这需要解析时间戳信息并以允许SORT生成按时间顺序列表的方式重新格式化它。不幸的是,解析时间戳非常依赖于语言环境。
这是一个与OP的语言环境设置一起使用的批处理解决方案。它按时间顺序按创建时间戳排序,然后按完整文件路径按字母顺序排序。
@echo off
setlocal
set "tempFile=%temp%\listCreateTime%random%.txt"
>"%tempFile%" (
for /d /r %%F in (.) do (
pushd "%%F"
for /f "eol= delims=" %%S in ('2^>nul dir /tc /a-d *') do (
for /f "tokens=1-6* delims=/ " %%A in ("%%S") do (
if "%%D"=="12:00" (
echo %%C%%A%%B%%E00:00%%~fG*%%A/%%B/%%C %%D %%E %%~fG
) else (
echo %%C%%A%%B%%E%%D%%~fG*%%A/%%B/%%C %%D %%E %%~fG
)
)
)
popd
)
)
for /f "tokens=2 delims=*" %%A in ('sort /r "%tempFile%"') do echo %%A
del "%tempFile%"
也可以使用WMIC来获取和排序信息。它更加简单,因为时间戳已经格式化,允许SORT按时间顺序对其进行排序,因此无需解析。它也是与语言环境无关的 - 它应该适用于支持WMIC的世界上任何Windows机器。但是这种方法比较慢,输出也不那么容易阅读。当然可以添加额外的编码来解析时间戳中的子串并重新格式化为更熟悉的形式。
@echo off
setlocal disableDelayedExpansion
set "tempFile=%temp%\listCreateTime%random%.txt"
>"%tempFile%" (
for /d /r %%F in (.) do (
set "folder=%%~pnxF\"
set "drive=%%~dF"
setlocal enableDelayedExpansion
2>nul wmic datafile where "drive='!drive!' and path='!folder:\=\\!'" get name, creationDate|findstr /brc:[0-9]
endlocal
)
)
sort /r "%tempFile%"
del "%tempFile%"
时间戳位于YYYYMMDDhhmmss.ddddddzzzz