If statement Windows批处理if语句受if块中语句的影响

If statement Windows批处理if语句受if块中语句的影响,if-statement,batch-file,If Statement,Batch File,在Windows Server 2012上执行以下Windows批处理脚本时: @echo off SET v=() IF 1 == 2 ( echo hi echo %v:~0% echo 1 equals 2 ) ELSE ( echo 1 does not equal 2 ) IF 1 == 2 ( echo %v:0% echo 1 equals 2 ) ELSE ( echo 1 does not equal 2 ) 我得到以下输出: 1 equals

在Windows Server 2012上执行以下Windows批处理脚本时:

@echo off
SET v=()
IF 1 == 2 (
  echo hi
  echo %v:~0%
  echo 1 equals 2
) ELSE (
  echo 1 does not equal 2
)


IF 1 == 2 (
  echo %v:0%
  echo 1 equals 2
) ELSE (
  echo 1 does not equal 2
)
我得到以下输出:

1 equals 2
1 does not equal 2
1 does not equal 2

有人能告诉我为什么会这样吗?即使v的值为(),我也不想进入以echo hi开头的块。

我不太确定您的意图,但我认为您的问题可以通过以下方式解决

变量
%v%
在运行
IF
命令之前进行分析,该变量包含有问题的右括号。因此,代码读取,
echo%v:~0%
作为
echo(
并关闭
IF
然后解析下一行,即
echo 1等于2,并按预期打印它

要防止出现这种情况,请在定义该变量时转义该括号:

@echo关闭
设置“v=(^)”
如果1==2(
回声嗨
回显%v:~0%
回声1等于2
)否则(
回声1不等于2
)
如果1==2(
回声%v:0%
回声1等于2
)否则(
回声1不等于2
)
或者,最好还是启用延迟扩展,以便在运行命令之前不解析变量内容,只有在以下情况下:

@echo关闭
设置“v=()”
延迟扩展
如果1==2(
回声嗨
回声!v:~0!
回声1等于2
)否则(
回声1不等于2
)
如果1==2(
回声!v:0!
回声1等于2
)否则(
回声1不等于2
)