2017-06-13 43 views
0

这应该很简单,但不能正常工作。Folder1和Folder2日志在批处理文件中没有正确显示

FOR /D %%d IN ("D:\Folder*") DO (
    FOR /R "%%d\logs" %%i IN (*) do echo %%i 
) 
pause 

我也曾尝试:

FOR /D %%d IN ("D:\Folder*") DO (
    SET fld=%%d 
    FOR /R "%fld%\logs" %%i IN (*) do echo %%i 
) 
pause 

我觉得我失去了一些东西基本相当。

谢谢!

回答

3

首先代码

FOR /D %%d IN ("D:\Folder*") DO (
    FOR /R "%%d\logs" %%i IN (*) do echo %%i 
) 

失败,因为你不能在for /r的文件夹中使用for替换参数。在for解析器的工作方式中,在for /d开始执行之前,用作/R中使用的起始文件夹的值必须可用。

二码

FOR /D %%d IN ("D:\Folder*") DO (
    SET fld=%%d 
    FOR /R "%fld%\logs" %%i IN (*) do echo %%i 
) 

失败,因为你认为%fld%将不会被解析。完整的for /d %%d被解析为只有一个命令,并且该命令中的所有引用都被删除,在开始执行之前被存储在变量中的值替换。您不能在同一个命令中更改变量的值并检索更改后的值,因为执行时没有包含在命令中的任何变量扩展,只有变量在解析命令时具有的值。

这通常处理为启用延迟扩展,因此您可以将需要的地方%var%更改为!var!以向解析器指示应该延迟变量扩展(值检索),直到执行命令为止。所以,你可以写类似

setlocal enabledelayedexpansion 
FOR /D %%d IN ("D:\Folder*") DO (
    SET "fld=%%d" 
    FOR /R "!fld!\logs" %%i IN (*) do echo %%i 
) 

但这也将无法正常工作,在第一代码所表示的一样的道理。在解析时需要使用/R的值。

那么,如何解决这个问题呢?

可避免先改变当前的活动目录到文件夹中for /D %%i

for /d %%d in ("d:\Folder*") do (
    pushd "%%~fd\logs" && (
     for /r %%i in (*) do echo %%i 
     popd 
    ) 
) 

被迭代,以指示/R的文件夹,也可以把内循环在一个单独的子程序

for /d %%d in ("d:\Folder*") do call :process "%%d" 
goto :eof 


:process folderPath 
for /r "%~1\logs" %%i in (*) do echo %%i 
goto :eof 

或者您可以使用for /f代替内递归for处理递归dir

for /d %%d in ("d:\Folder*") do (
    for /f "delims=" %%i in ('dir "%%~fd\logs" /a-d /b /s`) do echo %%i 
) 
0

你也可以简化它。

For /D %%A In ("D:\Folder*") Do Where/R "%%~A" * 
+0

'logs'子文件夹部分丢失。 – LotPings

相关问题