批处理脚本帮助 - 将 DelayedExpansion Var 的子字符串替换为另一个 DelayedExpansion Var

2023-11-30

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


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

在另一个变量中扩展一个变量的经典方法是对外部使用延迟扩展,对内部使用正常扩展: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被回显到屏幕上。

这可行,但速度相对较慢。如果扩展值具有特殊字符,例如>, & or |。我很少使用这种技术。

解决方案2

快速且更可靠的方法是分两步进行扩展。首先传输的值!var2!到 FOR 变量。然后,您可以使用 FOR 变量作为替换字符串,并在第二步中使用延迟扩展。这完全避免了更脆弱的百分比扩展。

for /f "delims=" %%A in ("!var2!") do echo !var1:SomeText=%%A!

上面的方法之所以有效,是因为 FOR 变量扩展发生在延迟扩展之前。

这是迄今为止我解决这个问题的首选方法。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

批处理脚本帮助 - 将 DelayedExpansion Var 的子字符串替换为另一个 DelayedExpansion Var 的相关文章

随机推荐