4

基本上我正在尝试做 !var1:SomeText=!var2!! 但这段代码不起作用。我错过了什么?

4

1 回答 1

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对 Windows 命令解释器 (CMD.EXE) 如何解析脚本的回答?

于 2012-08-10T21:31:25.567 回答