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

If statement DOS批处理if语句的奇怪行为:预期还是错误?,if-statement,batch-file,environment-variables,global-variables,delayedvariableexpansion,If Statement,Batch File,Environment Variables,Global Variables,Delayedvariableexpansion,我刚刚遇到了一些完全奇怪的事情,我想知道这是预期的行为还是在批处理文件过程中发现了某种奇怪的错误。下面是一个示例脚本,它显示了我正在谈论的行为,没有详细说明我要做的事情 或多或少,我所经历的是,在从if语句内部调用的函数调用中设置的全局环境变量在if语句退出之前实际上不会被设置 @echo off set myvar=1 echo %myvar% (should be 1) if [%fakevar%] == [] ( call:setEnvVars echo %myvar%

我刚刚遇到了一些完全奇怪的事情,我想知道这是预期的行为还是在批处理文件过程中发现了某种奇怪的错误。下面是一个示例脚本,它显示了我正在谈论的行为,没有详细说明我要做的事情

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


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

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

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