首先代碼
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