批处理文件无法在条件语句中设置环境变量

Dan*_*nov 14 batch-file

为什么下面的Windows批处理文件输出Foofollowedby Bar,而不是Baz

@echo off
setlocal

set _=Foo
echo %_%
set _=Bar
if 1==1 (
    set _=Baz
    echo %_%
)
Run Code Online (Sandbox Code Playgroud)

我的系统上的输出(Microsoft Windows XP [版本5.1.2600])是:

Foo
Bar
Run Code Online (Sandbox Code Playgroud)

如果我删除条件语句,则会观察到Foo和的预期输出Baz.

pax*_*blo 28

发生的事情是在读取行时完成变量替换.你没有考虑到的是:

if 1==1 (
    set _=Baz
    echo %_%
)
Run Code Online (Sandbox Code Playgroud)

尽管你可能想到的是一条 "线".扩展"%_%"set声明之前完成的.

你需要的是延迟扩张.几乎我的每一个命令脚本都以这个命令脚本"setlocal enableextensions enabledelayedexpansion"的全部功能开头cmd.exe.

所以我的脚本版本是:

@echo off
setlocal enableextensions enabledelayedexpansion

set _=Foo
echo !_!
set _=Bar
if 1==1 (
    set _=Baz
    echo !_!
)

endlocal
Run Code Online (Sandbox Code Playgroud)

这会生成正确的"Foo", "Baz"而不是"Foo", "Bar".

  • 太棒了,谢谢你的详细解释.我想我再一次反对这个确切的限制,但是在一个更受限制的环境中:http://stackoverflow.com/questions/879023/honoring-exit-codes-from-batch-files-invoked-by- msbuild不幸的是,如果我使用MSBuild`Exec`任务,我没有能力打开命令扩展...嗯... (2认同)