2011-07-28 45 views
1
for .... do (
    call echo !line:%%foo%%=bar! 
) 

我在bat文件中用來代替變量%foo%值的代碼。
但它的工作原理治療%foo%作爲文字%跡象。與命令echo !line:%%foo%%=bar!(withtout call)的結果相同。 call命令不起作用。 我不知道爲什麼它可以爲call echo %%foo%%從bat文件讀取命令行後沒有工作,使call echo將解析%foo%值。關於「call echo!line:%% foo %% = bar!」

回答

1

它不能因爲解析器階段的秩序。

樣品執行用於

set foo=xxx 
set line=Content xxx # %%foo%% # 

第一階段是膨脹百分率相。
你在括號中使用它不會改變這種行爲。
所以,你得到
call echo !line:%foo%=bar!

然後塊的開始執行,如果執行線下一個相關階段是延遲擴張階段,%foo%將被替換而不是內容,讓您得到
call echo Content xxx # bar #

現在通話重新開始與百分號展開解析器,但目前還沒有百分比了。

我想foo的內容可以在FOR-Loop裏面改變,所以你需要在解析塊的時候隨時擴展它。

即使你逃跑的感嘆號,讓他們通話後首次啓用,它不能正常工作,因爲延遲擴展不呼叫執行的內部工作。

但你可以使用它代替,這個工程作爲FOR-可變擴張階段僅僅是推遲擴張階段之前。

for ... do (
    for /F "delims=" %%F in("!foo!") DO 
    echo !line:%%F=bar! 
) 

約解析器階段的幾點說明是在How does the Windows Command Interpreter (CMD.EXE) parse scripts?

+0

感謝@jeb,我現在知道了。由於我省略了「!」的運行優先級,感嘆號解析。在發佈這個問題之前,我通過call:label!foo!得到了一個解決方法,使用%1參數引用。 :) –

相關問題