2016-09-28 52 views
3

我使用在Windows 7目前我正在试图从每个子目录中获取最新的文件,并把它们打印到Windows命令行批处理脚本返回最新的文件屏幕。举例来说,如果我有:如何在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,这对构建我现在有的东西非常有帮助,但最终它没有奏效。

+0

你的代码看起来除了不使用延迟扩展良好。 – Squashman

+0

最后一个示例文件夹是否正确,或者有两个拼写错误?我的意思是,'C:\ Home \ Hi \ Folder2 \ y 03/01/2016'而不是'C:\ Homeh \ Hi \ Folder2 \ y 03/1/2016' ... – aschipfl

回答

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,扫描目录中的文件(不是目录),基本格式,反向日期顺序,压制任何“找不到文件”从空目录报告。

在找到第一个(即最年轻的)文件中设置的标志first和报告文件名 - 或者你需要的文件名的部分。

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

请注意,指定的日期时,它的最好说明您正在使用的格式 - 或者至少是使用日期,其中的日数为> 12,这应该是足够的。例如,您的日期“01/10/2016”可能会被解释为1月10日或10月1日,具体取决于受访者的语言环境。 “2016年10月13日”或“10/13/2016”将使问题变得明显。

1

您需要申请delayed expansion因为你正在编写和相同的代码块中读取变量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 

另外,更换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 

另外,我改进引用。

相关问题