基本上我正在嘗試!var1:SomeText =!var2 !!但是這個代碼不起作用。 我錯過了什麼?批處理腳本幫助 - 用另一個DelayedExpansion Var替換DelayedExpansion Var的子串
4
A
回答
6
執行搜索和替換操作時使用變量進行搜索和/或替換時,擴展順序至關重要。在外部搜索和替換擴展發生之前,內部變量必須展開。嘗試使用延遲擴展顯然無法工作,因爲延遲擴展發生在一個時間點。
另一個變量中變量的擴張經典方法使用外爲內延遲擴展,而正常:echo !var1:SomeText=%var2%!"
我會假設你想用延遲擴展兩個是有原因的。也許擴展發生在一個代碼塊中,其中一個變量設置在同一個塊中。正常擴展將無法正常工作,因爲直到塊結束後才能看到在塊內分配的值。
解決方案1
一個解決問題的方法是使用CALL:
call echo %%var1:SomeText=!var2!%%
這種工作方式如下:
解析器的百分比階段轉換的雙百分比轉化爲單個百分比,導致
call echo %var1:SomeText=!var2!%
延遲膨脹展開!VAR2!導致
call echo %var1:SomeText=ReplacementText%
的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?的回答
相關問題
- 1. 如何使用delayedexpansion處理批處理腳本中的值
- 2. 修改爲不使用批處理腳本中的delayedexpansion
- 3. Windows CMD批處理:FOR/R with DelayedExpansion
- 4. 用var替換另一個數字
- 5. 從另一個批處理腳本調用批處理腳本
- 6. 替換批處理腳本中的子字符串
- 7. 用pow替換var^power(var,power)
- 8. 退出調用另一個批處理腳本的批處理腳本
- 9. 在另一個批處理腳本中調用另一個批處理循環
- 10. 批處理腳本編輯另一批處理腳本
- 11. 用var替換var中的數字
- 12. 幫助CC處理腳本
- 13. 批處理腳本幫助,括號後退出的腳本
- 14. 批處理腳本幫助請求:如何找到換行符?
- 15. 替換使用var
- 16. 批處理腳本查找和替換
- 17. 將php4類轉換爲php5:幫助替換「var $ thisvar;」到PHP5 equivilant
- 18. bash腳本:組合var = $(...)和var = $ {var %% ...}行?
- 19. 用%替換字符串(僅使用批處理腳本)
- 20. JQuery替換var值
- 21. 批處理腳本(Windows)用扭曲字符串替換
- 22. 使用windows批處理腳本替換%% 20字符串
- 23. 搜索並用批處理腳本中的報價替換
- 24. 幫助GATC和var _gaq = _gaq || [];
- 25. 需要幫助使用批處理腳本
- 26. Bash腳本幫助「如果(用戶輸入)=然後(var)=」
- 27. Javascript Var範圍幫助
- 28. Windows批處理腳本:子串計算
- 29. 批處理設置var in for循環
- 30. 如何在jquery或javascript中連接另一個var字符串中的var?