如果没有阻止,为什么批处理文件中没有设置变量?

时间:2018-07-11 21:39:14

标签: batch-file

相信我,我已经四处搜寻,但是对于这个看似无害的问题我并没有感到高兴。

注意:在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,因为我提到过这一点,但这没什么区别。

1 个答案:

答案 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%

(我现在更讨厌批处理文件!)