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

我正在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" 

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

注意:我已经查看了其他各种示例,比如: 在windows批处理中的每个子目录中生成最新文件的列表 ,这对于构build我现在具有的function非常有帮助,但最终却无效。

您需要在写入代码时使用延迟扩展 ,并在同一代码块中读取变量NEWEST

 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 

或者,通过call echo %%NEWEST%%替换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 

另外,我提高了报价。

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

对于每个目录,转到目录, first清除标志,扫描目录中的文件(不是目录),基本格式,反向日期顺序,从空目录中抑制任何“找不到文件”报告。

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

一旦first被设置,报告机制将不会被调用, if defined了对变量的当前值的作用一样。

请注意,在指定日期时,建议您使用的格式 – 或至少使用日期编号大于12的日期,这应该是足够的。 例如,您的日期“01/10/2016”可能会被解释为1月10日或10月1日,取决于受访者的语言环境。 “13/10/2016”或“10/13/2016”将使问题变得明显。