我刚刚发现了一些奇怪的东西,我想知道这是否是预期的行为,或者我是否在批处理文件处理中发现了某种奇怪的错误。在不深入了解我正在尝试做的细节的情况下,下面是一个示例脚本,显示了我正在谈论的行为。
或多或少,我所遇到的是,在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)
因此,重申一下,这是预期的行为(以及为什么)?或者我遇到某种错误?
答案 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 /?
命令帮助中的说明。