2016-02-25 39 views
2

我想爲變量中提供的每個路徑執行一些for循環。該echo !temp!作品就好了,但是它下面的命令將不起作用:爲什麼不將延遲擴展工作作爲for命令的參數

@echo off 
setlocal enabledelayedexpansion 

set paths=(C:\test C:\test2) 

for %%p in %paths% do (
    set temp=%%p 
    echo !temp! 
    for /r !temp! %%f in (*.h) do (echo %%f) 
    for /r !temp! %%g in (*.h *.cpp) do (echo %%g) 
) 
+4

http://stackoverflow.com/questions/4334209/nested-batch-for-loops – CristiFati

+2

我認爲問題是,'for'命令根據[本文](http://stackoverflow.com/a/4095133)(見第二階段結束),在*延遲擴展發生之前處理*。你可以用兩種方法解決這個問題:1.在內部的for/R'循環之前切換到'!temp!'目錄,而不要在'/ R'之後放置'!temp!'; 2.將'for/R'循環移動到一個子例程中,傳遞'!temp!'作爲參數並使用'%1'擴展(參見'call /?')... – aschipfl

+0

@CristiFati這個問題的確是與您的帖子相同。我在那裏找到了解決方案。我該怎麼處理這個問題?去掉? – RobbinMarcus

回答

3

在所有for commands語法模式:

FOR %%parameter IN (set) DO command 
    FOR /R [[drive:]path] %%parameter IN (set) DO command 
    FOR /D %%parameter IN (folder_set) DO command 
    FOR /L %%parameter IN (start,step,end) DO command 
    FOR /F ["options"] %%parameter IN (filenameset) DO command 
    FOR /F ["options"] %%parameter IN ("Text string to process") DO command 
    FOR /F ["options"] %%parameter IN ('command to process') DO command 

%%parameter的所有文本,應在第一解析階段是已知的。閱讀How does the Windows Command Interpreter (CMD.EXE) parse scripts?

然而,接下來的腳本應該按預期工作

@ECHO OFF 
SETLOCAL EnableExtensions EnableDelayedExpansion 
set "paths=(C:\test C:\test2)" 

for %%p in %paths% do (
    set "temp=%%~p" 
    echo !temp! 
    call :doit 
) 

rem skip procedure 
goto :domore 

:doit 
    for /r "%temp%" %%f in (*.h) do (echo %%f) 
    for /r "%temp%" %%g in (*.h *.cpp) do (echo %%g) 
goto :eof 

:domore