dbe*_*ham 6

在执行搜索和替换使用变量进行搜索和/或替换的操作时,扩展顺序至关重要.必须在外部搜索和替换扩展之前扩展内部变量.尝试使用延迟扩展两者显然不起作用,因为延迟扩展发生在一个时间点.

在另一个变量中扩展变量的经典方法使用外部的延迟扩展和内部的正常扩展: echo !var1:SomeText=%var2%!"

我打算假设你想为两者使用延迟扩展是有原因的.也许扩展发生在代码块中,其中一个变量设置在同一个块中.正常扩展将不起作用,因为在块结束之前,它无法看到块内分配的值.

解决方案1

解决问题的一种方法是使用CALL:

call echo %%var1:SomeText=!var2!%% 
Run Code Online (Sandbox Code Playgroud)

其工作原理如下:

  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!
Run Code Online (Sandbox Code Playgroud)

以上是有效的,因为FOR变量扩展发生在延迟扩展之前.

到目前为止,这是我解决此问题的首选方法.

有关批处理解析器各个阶段的更全面说明,请参阅jeb 对Windows命令解释器(CMD.EXE)如何解析脚本的回答