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

标签 batch-file

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

相关文章:

for-loop - Windows批处理中以逗号分隔的for循环列表

windows - 为什么从 go (golang) 调用时 Powershell Start-Process 不起作用?

batch-file - 计算机不遵守 powercfg GUID 命令行指令

windows - 获取 SVN 修订号到批处理文件变量

batch-file - 如何设置变量,然后在命令提示符下的同一行中使用它

windows - 进程运行时清空日志文件?

ios - iOS 中的 SQLite 多个 INSERT

flash - 检查 Flash 版本的脚本并不是真正检查版本

windows - 如何使批处理文件将字符串作为命令运行?

visual-studio - 使用 VSIX 包含批处理文件