回答

6

執行搜索和替換操作時使用變量進行搜索和/或替換時,擴展順序至關重要。在外部搜索和替換擴展發生之前,內部變量必須展開。嘗試使用延遲擴展顯然無法工作,因爲延遲擴展發生在一個時間點。

另一個變量中變量的擴張經典方法使用外爲內延遲擴展,而正常:echo !var1:SomeText=%var2%!"

我會假設你想用延遲擴展兩個是有原因的。也許擴展發生在一個代碼塊中,其中一個變量設置在同一個塊中。正常擴展將無法正常工作,因爲直到塊結束後才能看到在塊內分配的值。

解決方案1 ​​

一個解決問題的方法是使用CALL:

call echo %%var1:SomeText=!var2!%% 

這種工作方式如下:

  1. 解析器的百分比階段轉換的雙百分比轉化爲單個百分比,導致
    call echo %var1:SomeText=!var2!%

  2. 延遲膨脹展開!VAR2!導致
    call echo %var1:SomeText=ReplacementText%

  3. 的CALL ECHO被執行並且處理百分比的附加電平發生。執行搜索和替換擴展,導致ResultOfSearchAndReplace回顯到屏幕。

這個工作,但它是比較慢。如果擴展值具有特殊字符(如>,&|),那麼它也會出現問題。我很少使用這種技術。

溶液2

快速和更可靠的方法是做擴張分兩步完成。首先將!var2!的值轉換爲FOR變量。然後可以使用FOR變量作爲替換字符串,並在第二步中使用延遲擴展。這完全避免了更脆弱的百分比擴展。

for /f "delims=" %%A in ("!var2!") do echo !var1:SomeText=%%A! 

上述工作原因是因爲FOR變量擴展發生在延遲擴展之前。

這是迄今爲止我的首選方法來解決這個問題。

有關批處理解析器各個階段的更全面說明,請參閱jeb對How does the Windows Command Interpreter (CMD.EXE) parse scripts?的回答

相關問題