首先代码
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
)
'logs'子文件夹部分丢失。 – LotPings