这是我的文件夹结构
false
目前,我正在使用下面的代码递归获取最新的.bak文件。
Temp
- Folder ZZZ (Created on 7 Feb)
-- FileA.bak (Created on 7 February)
-- FileB.bak (Created on 8 February)
-- FileC.bak (Created on 9 February)
- Folder B (Created on 10 Feb)
-- FileD.bak (Created on 10 February)
-- FileE.bak (Created on 11 February)
-- FileF.bak (Created on 12 February)
当只有一个子目录时,上面的代码很有效。在有多个子目录的情况下,它开始中断。例如,在上面的文件夹结构中,获取最新文件总是导致FOR /F "delims=|" %%I IN ('DIR /s "D:\Temp\*.bak" /b /O:D') DO SET latestBakFile=%%I
。我期望的结果是FileC.bak
推理问题
我使用FileF.bak
进行了测试,将DIR /s "D:\Temp\*.bak" /b /O:D
与/O:D
互换,发现子目录始终按字母顺序排序,然后根据日期修改时间排序文件目录。我认为这是原因。
有哪种方法可以始终在/O:-D
目录中获取最新的.bak
文件,而不管Temp
文件位于哪个子目录中?
答案 0 :(得分:0)
试一试
@echo off
setlocal enableextensions disabledelayedexpansion
for /f "tokens=2,*" %%a in ('
robocopy "d:\temp" "d:\temp" *.bak /njh /njs /nc /ns /l /is /ndl /ts /s
^| 2^>nul sort /r
^| cmd /v /q /c"set/p.=&(echo(!.!)"
') do echo %%b
此代码使用robocopy
命令检索具有ISO顺序(yyyy/mm/dd hh:nn:ss
)时间戳的文件列表。此列表按相反顺序排序,将最新元素保留在列表的第一个位置。管道cmd
实例将只读取并输出列表的第一行(较新文件),以避免必须使用{{1来处理完整列表(sort
命令的所有输出)命令。