批处理:从SETLOCAL EnableDelayedExpansion返回值

时间:2012-02-23 07:42:01

标签: string shell batch-file console delayedvariableexpansion

我想知道为什么这段代码没有按预期工作:

@ECHO off
SET S1=HELLO

SETLOCAL EnableDelayedExpansion
SET S2=!S1! WORLD^^!
ECHO !S2!
ENDLOCAL & SET S1=!S2!

ECHO %S1%
PAUSE

输出:

HELLO WORLD!
!S2!

预期产出:

HELLO WORLD!
HELLO WORLD!

感谢。

1 个答案:

答案 0 :(得分:9)

按预期工作。
延迟扩展将在执行时扩展变量,而不是解析时间,因此它将您的行ENDLOCAL & SET S1=!S2!解释为
endlocal
但是在SET S1=!S2!部分,延迟扩张已经关闭,因此无法再扩展。

在你的情况下你可以使用 ENDLOCAL & SET S1=%S2%

由于感叹号是S2是“安全的”,因为延迟exp。在执行时已经关闭。

但总是安全的回归有点复杂 我们在Dostips: Return ANY string across ENDLOCAL boundry

进行了讨论