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

时间:2012-08-10 16:22:30

标签: variables batch-file substring windows-scripting delayedvariableexpansion

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

1 个答案:

答案 0 :(得分: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回显到屏幕。

  4. 这有效,但速度相对较慢。如果展开的值包含>&|等特殊字符,也会出现问题。我很少使用这种技术。

    解决方案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?的答案