我想知道为什么这段代码不能按预期工作:
@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!
谢谢。
我想知道为什么这段代码不能按预期工作:
@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!
谢谢。
它按预期工作。
延迟扩展将在执行时扩展变量,而不是解析时,因此它将您的行解释ENDLOCAL & SET S1=!S2!
为
endlocal
但在SET S1=!S2!
延迟扩展的部分已关闭,因此无法再扩展。
在您的情况下,您可以使用
ENDLOCAL & SET S1=%S2%
由于感叹号是 S2 是“安全的”,作为延迟的 exp。执行时关闭。
但是始终安全的返回要复杂一些。
我们在Dostips 中讨论过它:返回任何字符串跨越 ENDLOCAL 边界