回答

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?的回答

相关问题