我在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
它将返回:文件夹b
和x
。
我已经写了一些脚本来尝试这个,但它只返回最后一个目录中的最新文件,在我的例子中是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 :(得分: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"会使问题变得明显。