2

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

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

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

4

1 回答 1

4

Your issue have no relation to if command, but to Delayed Expansion. Try this example:

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

and compare it vs. this one:

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

For further details, search for "Delayed Expansion" in this forum and/or read the explanation in set /? command help.

于 2013-07-07T12:21:30.847 回答