如何在嵌套的多个目录中获取最新的修改文件?

时间:2017-02-27 10:57:11

标签: batch-file

这是我的文件夹结构

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文件位于哪个子目录中?

1 个答案:

答案 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命令的所有输出)命令。