我刚刚遇到了一些完全奇怪的事情,我想知道这是预期的行为,还是在批处理文件中发现了某种奇怪的错误。下面是一个示例脚本,展示了我正在谈论的行为,而不涉及我试图做什么的细节。
或多或少,我所经历的是,在从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 /?
命令帮助中的解释。