DOS批处理if语句的奇怪行为:预期或错误



我刚刚遇到了一些完全奇怪的事情,我想知道这是预期的行为,还是在批处理文件中发现了某种奇怪的错误。下面是一个示例脚本,展示了我正在谈论的行为,而不涉及我试图做什么的细节。

或多或少,我所经历的是,在从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)

那么,重申一下,这是预期的行为吗(为什么)?或者我遇到了某种bug?

您的问题与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 /?命令帮助中的解释。

相关内容

  • 没有找到相关文章