相信我,我已经四处搜寻,但是对于这个看似无害的问题我并没有感到高兴。
注意:在for
循环中,有一些关于批处理变量的SO相关问题的文章和答案;许多人可能不会意识到if
块会给扩展带来同样的麻烦。
我离批处理文件狂热者还很远,所以我可能缺少一些基本知识,但是当我运行以下脚本时:
set testVar1=Initial Value 1
echo testVar1 = %testVar1%
if 1==1 (
echo In If Block
echo testVar1 = %testVar1%
set testVar1=In If Block
echo testVar1 = %testVar1%
set testVar2=Initial Value 2
echo testVar2 = %testVar2%
)
echo Out of If Block
echo testVar1 = %testVar1%
echo testVar2 = %testVar2%
我得到:
testVar1 = Initial Value 1
In If Block
testVar1 = Initial Value 1
testVar1 = Initial Value 1
testVar2 =
Out of If Block
testVar1 = In If Block
testVar2 = Initial Value 2
我希望看到的是:
testVar1 = Initial Value 1
In If Block
testVar1 = Initial Value 1
testVar1 = In If Block
testVar2 = Initial Value 2
Out of If Block
testVar1 = In If Block
testVar2 = Initial Value 2
在if
块中,我更改了testVar1
的值,但是当我回显它时,它具有原始值。同样,我在testVar2
块中创建了一个新的if
变量,但是当我回显它时,它的值为空。
但是,一旦退出if
块,则在回显时在其中设置的值是正确的。
我已经非常小心地声明了空格,就像其他地方提到的那样,我已经尝试了几种变体,但是以上是我可以设计的最基本的测试来说明问题。
正如我所说,毫无疑问我遗漏了一些明显的东西,但我不知道它是什么。
我也曾尝试添加setlocal EnableDelayedExpansion
,因为我提到过这一点,但这没什么区别。
答案 0 :(得分:1)
好,是的,我的无知。这是解决方法,这要感谢npocmaka:
setlocal EnableDelayedExpansionset
testVar1=Initial Value 1
echo testVar1 = %testVar1%
if 1==1 (
echo In If Block
echo testVar1 = !testVar1!
set testVar1=In If Block
echo testVar1 = !testVar1!
set testVar2=Initial Value 2
echo testVar2 = !testVar2!
)
echo Out of If Block
echo testVar1 = %testVar1%
echo testVar2 = %testVar2%
(我现在更讨厌批处理文件!)