批处理脚本帮助 - 替换DelayedExpansion瓦尔子串与另一DelayedExpansio

2019-06-26 23:39发布

基本上我试图做VAR1:!SomeText = VAR2! 但是这个代码不工作。 我在想什么?

Answer 1:

做一个搜索和替换使用的变量的搜索和/或替换操作时膨胀的顺序是关键的。 内部变量必须外搜索之前被扩展和替换发生膨胀。 试图同时用于延迟扩张显然是因为延迟膨胀发生在一个时间点无法正常工作。

为另一个变量内的可变的膨胀的经典方法是使用用于外用于内延迟扩展,并正常: 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!

上述工作,因为变量扩展需要延迟扩展前的地方。

这是迄今为止我攻击这个问题首选方法。

对于批量解析器的不同阶段的更全面的解释,是指杰布的答案, 如何在Windows命令解释器(CMD.EXE)解析脚本?



文章来源: Batch Scripting Help - Replace Substring of a DelayedExpansion Var with another DelayedExpansion Var