【问题标题】:Batch file fails to set environment variable within conditional statement批处理文件未能在条件语句中设置环境变量
【发布时间】:2009-05-18 11:21:25
【问题描述】:

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

如果我删除条件语句,则会观察到 FooBaz 的预期输出。

【问题讨论】:

标签: batch-file


【解决方案1】:

发生的情况是在读取一行时完成了变量替换。您没有考虑到以下事实:

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"

【讨论】:

  • 太棒了,感谢您的详细解释。我想我又一次遇到了这个确切的限制,但在一个更受限制的环境中:stackoverflow.com/questions/879023/… 不幸的是,如果我使用 MSBuild Exec 任务,我无法打开命令扩展。 .. 嗯...
【解决方案2】:

这个问题的答案与Weird scope issue in batch file的答案相同。有关详细信息,请参见那里。基本上变量扩展是在行读取时完成的,而不是在执行时。

【讨论】:

    【解决方案3】:

    试试这个

    @echo off
    setlocal
    
    set _=Foo
    echo %_%
    set _=Bar
    if "1" NEQ "2" goto end
    set _=Baz
    echo %_%
    :end
    

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2017-04-21
      • 2014-01-08
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      相关资源
      最近更新 更多