DOS批处理if语句的奇怪行为:期望还是错误?

时间:2013-07-07 11:39:32

标签: if-statement batch-file global-variables environment-variables

我刚刚发现了一些奇怪的东西,我想知道这是否是预期的行为,或者我是否在批处理文件处理中发现了某种奇怪的错误。在不深入了解我正在尝试做的细节的情况下,下面是一个示例脚本,显示了我正在谈论的行为。

或多或少,我所遇到的是,在if语句内部调用的函数调用中设置的全局环境变量实际上不会被设置,直到if语句退出!

@echo off
set myvar=1

echo %myvar% (should be 1)

if [%fakevar%] == [] (
    call:setEnvVars
    echo %myvar% (should be 2^) 
)
echo %myvar% (should be 2)

:setEnvVars
    set myvar=2
GOTO:EOF

输出如下:

  

1(应为1)
  1(应为2)
  2(应该是2)

因此,重申一下,这是预期的行为(以及为什么)?或者我遇到某种错误?

1 个答案:

答案 0 :(得分:4)

您的问题与if命令无关,而与延迟扩展无关。试试这个例子:

@echo off
set myvar=1
echo %myvar%  & set myvar=2 & echo %myvar%

并与之比较:

@echo off
setlocal EnableDelayedExpansion
set myvar=1
echo %myvar% & set myvar=2 & echo !myvar!

有关详细信息,请在此论坛中搜索“延迟扩展”和/或阅读set /?命令帮助中的说明。