基本上我正在尝试!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?