2017-06-13 53 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

相關問題