如何使用批处理从Windows命令行中的每个子目录返回最新文件

时间:2016-09-28 18:08:11

标签: windows batch-file

我在Windows 7上使用Windows命令行的批处理脚本。我目前正在尝试从每个子目录获取最新文件并将其打印到屏幕上。例如,如果我有:

C:\Home\Hi\Folder1\a 01/05/2016
C:\Home\Hi\Folder1\b 01/10/2016

C:\Home\Hi\Folder2\x 03/05/2016
C:\Homeh\Hi\Folder2\y 03/1/2016

它将返回:文件夹bx

我已经写了一些脚本来尝试这个,但它只返回最后一个目录中的最新文件,在我的例子中是x。脚本是:

 FOR /R "C:\Users\Maxx\Desktop\tools" %%G in (.) DO (
     Pushd %%G
     FOR /F %%I IN ('DIR %%G /B /O:D') DO SET NEWEST=%%I
          ECHO %NEWEST%
          Popd )
 Echo "back home"

如果有人知道如何从每个子目录中获取最新的文件,那就太棒了。

注意:我已经查看过各种其他示例,例如:Generate a list of the newest file in each subdirectory in windows batch,它对我现在拥有的东西非常有帮助,但最终它没有用。

2 个答案:

答案 0 :(得分:1)

在编写和阅读同一代码块中的变量NEWEST时,您需要应用delayed expansion

setlocal EnableDelayedExpansion
for /R "C:\Users\Maxx\Desktop\tools" %%G in (.) do (
    pushd "%%~G"
    for /F %%I in ('dir "%%~G" /B /O:D') do set "NEWEST=%%I"
        echo !NEWEST!
    )
    popd
echo back home
endlocal

或者,将echo %NEWEST%替换为call echo %%NEWEST%%

for /R "C:\Users\Maxx\Desktop\tools" %%G in (.) do (
    pushd "%%~G"
    for /F %%I in ('dir "%%~G" /B /O:D') do set "NEWEST=%%I"
        call echo %%NEWEST%%
    )
    popd
echo back home

另外,我改进了引用。

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL

FOR /R "C:\106x" %%G in (.) DO (
 Pushd "%%G"
 SET "first="
 FOR /F "delims=" %%I IN ('DIR . /a-d /B /O:-D 2^>nul') DO IF NOT DEFINED first SET first=Y&ECHO %%~dpI
 Popd 
)
Echo "back home"

GOTO :EOF

对于每个目录,转到目录,清除标志first,扫描目录中的文件(不是目录),基本格式,反向日期顺序,禁止找不到任何"文件&#34 ;来自空目录的报告。

在找到第一个(即最年轻的)文件时,设置标志first并报告文件名 - 或您需要的部分文件名。

设置first后,将不会调用报告机制,因为if defined适用于变量的当前值。

请注意,在指定日期时,建议您说明您使用的格式 - 或者至少使用日期编号> 12的日期,这应该足够了。例如,您的日期" 01/10 / 2016"可能会被解释为1月10日或10月1日,具体取决于受访者的地区。 &#34 13/10/2016年"或" 10/13/2016"会使问题变得明显。