为什么下面的Windows批处理文件输出Foo
后跟 Bar
, 而不是 Baz
?
@echo off
setlocal
set _=Foo
echo %_%
set _=Bar
if 1==1 (
set _=Baz
echo %_%
)
我的系统(Microsoft Windows XP [版本 5.1.2600])上的输出是:
Foo
Bar
如果我删除条件语句,
Foo
的预期输出和 Baz
被观察到。
最佳答案
发生的事情是在读取一行时完成了变量替换。您没有考虑到的事实是:
if 1==1 (
set _=Baz
echo %_%
)
是一条“线”,不管你怎么想。
"%_%"
的扩展在 set
之前完成陈述。您需要的是延迟扩展。几乎我的每一个命令脚本都以
"setlocal enableextensions enabledelayedexpansion"
开头从而发挥cmd.exe
的全部力量.所以我的脚本版本是:
@echo off
setlocal enableextensions enabledelayedexpansion
set _=Foo
echo !_!
set _=Bar
if 1==1 (
set _=Baz
echo !_!
)
endlocal
这会生成正确的
"Foo", "Baz"
而不是 "Foo", "Bar"
.
关于batch-file - 批处理文件无法在条件语句中设置环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/877232/