为什么下面的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".