2015-05-19 89 views
4

在我的桌面上,有一個名爲「test」的文件夾。此文件夾內有兩個文件,「file1.txt」「file2.txt」Windows CMD批處理:FOR/R with DelayedExpansion

看看這個簡單的批處理腳本:

@ECHO OFF 

SET test="C:\Users\Tyler\Desktop\test" 

ECHO %test% 
FOR /R %test% %%F IN (*) DO (
    ECHO %%F 
) 

正如你所期望的,它輸出以下:

"C:\Users\Tyler\Desktop\test" 
C:\Users\Tyler\Desktop\test\file1.txt 
C:\Users\Tyler\Desktop\test\file2.txt 

現在來看看這種變化:

@ECHO OFF 

SETLOCAL ENABLEDELAYEDEXPANSION 

SET test="C:\Users\Tyler\Desktop\test" 

ECHO !test! 
FOR /R !test! %%F IN (*) DO (
    ECHO %%F 
) 

ENDLOCAL 

我希望它的輸出沒有什麼不同。然而,在這裏,它是:

"C:\Users\Tyler\Desktop\test" 

看來,!test!ECHO !test!線得到擴充,但不是在FOR /R !test!線,成爲剛剛!test!。因爲那當然不是有效的路徑,所以FOR/R循環不會迭代。

這是爲什麼?我錯過了什麼?

回答

5

爲什麼FOR作品不同於ECHO是因爲批解析器(cmd.exe)對於FOR,IFREM有特殊的parsing rules

因此延遲擴展不適用於這裏的參數,只適用於圓括號內的參數。

只有百分比擴展適用於參數,因爲解析器在切換到特殊的FOR解析器規則之前執行百分比擴展階段。

如果你不能使用百分比展開,因爲你在塊內部,你可以將代碼移動到一個自己的函數中並調用它。

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET test="C:\Users\Tyler\Desktop\test" 

ECHO !test! 
call :doMyLoop test 
exit /b 

:doMyLoop 
set "arg=!%1!" 
FOR /R %arg% %%F IN (*) DO (
    ECHO %%F 
) 
+0

這很有趣(和不幸)。謝謝! – TSmith