基本上我正在尝试做 !var1:SomeText=!var2!! 但这段代码不起作用。我错过了什么?
1 回答
在执行使用变量进行搜索和/或替换的搜索和替换操作时,扩展顺序至关重要。内部变量必须在外部搜索和替换扩展发生之前扩展。尝试对两者都使用延迟扩展显然是行不通的,因为延迟扩展发生在一个时间点。
在另一个变量中扩展一个变量的经典方法对外部使用延迟扩展,对内部使用正常扩展: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对 Windows 命令解释器 (CMD.EXE) 如何解析脚本的回答?