Batch file 如果在BAT文件中嵌套了其他内容,我做错了什么?

Batch file 如果在BAT文件中嵌套了其他内容,我做错了什么?,batch-file,Batch File,我有以下bat文件: @ECHO off set ErrorThreshold= set j=5 IF "%ErrorThreshold%"=="" ( echo a ) ELSE ( IF %j% GTR %ErrorThreshold% ( echo b ) ELSE ( echo c ) ) 如果ErrorThreshold没有值,程序会报告命令语法不正确。。如果我设定一个值,一切都会正常 有人能帮我找出哪里出了问题吗?如果ErrorThreshold什

我有以下bat文件:

@ECHO off
set ErrorThreshold=
set j=5

IF "%ErrorThreshold%"=="" (
  echo a
) ELSE (
  IF %j% GTR %ErrorThreshold% (
    echo b
  ) ELSE (
    echo c
  )
)
如果ErrorThreshold没有值,程序会报告命令语法不正确。。如果我设定一个值,一切都会正常


有人能帮我找出哪里出了问题吗?

如果
ErrorThreshold
什么都不是,那么这行:

IF %j% GTR %ErrorThreshold% (
扩展到:

IF 5 GTR (
这将导致语法错误,因为缺少等式的右侧

编辑: @没有名字的马

它仍然需要解析整个命令体才能理解第一条IF语句的完整范围。将样本减少至:

IF 1==1 (
  echo a
) ELSE (
  IF 1 GTR (
    echo b )
)

a
永远不会回显,因为它必须解析并匹配所有的
()
对。一旦遇到语法错误,它就会退出。

从逻辑上讲,只有当外部IF语句为false时,才会执行内部IF语句。但是批处理一次就可以解析ParentHtes中的复杂语句和块。解析的块中的每一行都必须是有效的语法,即使它没有被执行

正常变量展开发生在解析语句之前。因此,如果未定义变量,则内部if语句将变为
if 5 GTR(
),这是无效语法

您可以通过将两边都括在引号中来消除语法错误:
如果“%j%”GTR“%ErrorThreshold%”
,那么比较将不是数字

您可以在两侧加上0。这将保留数值比较,只要数字大小不超过有符号32位整数的限制,就可以工作:

IF "%ErrorThreshold%"=="" (
  echo a
) ELSE (
  IF %j%0 GTR %ErrorThreshold%0 (
    echo b
  ) ELSE (
    echo c
  )
)
另一个选项是将复杂语句分解为多个语句,如果未使用GOTO定义变量,则跳过第二个语句:

IF "%ErrorThreshold%"=="" (
  echo a
  goto skip
)
IF %j% GTR %ErrorThreshold% (
  echo b
) ELSE (
  echo c
)
:skip
还有一个选项是使用延迟扩展,它发生在解析语句之后。IF语句将在解析时看到文本
!ErrorThreshold!
,然后该值仅在执行时变为NULL。但是由于前面的IF语句,它永远不会执行,所以一切正常

@ECHO off
setlocal enableDelayedExpansion
set ErrorThreshold=
set j=5

IF "%ErrorThreshold%"=="" (
  echo a
) ELSE (
  IF !j! GTR !ErrorThreshold! (
    echo b
  ) ELSE (
    echo c
  )
)

注意:如果未定义ErrorThreshold,则可以使用
代替
如果“%ErrorThreshold%”=

问题是:如果%j%GTR%ErrorThreshold%
是空的,因为空的部分是第一次测试,为什么要执行
如果%j%GTR%ErrorThreshold%
。@一匹没有名字的马:增加了更多细节和减少了样本。如果在变量后面放一个零,所有的东西都能工作吗?(因此您仍然默认为零,但如果定义了变量,则不是将每个数字乘以10?@Kröw-否,因为前缀为0的数字被视为八进制符号,
08
09
是无效的八进制数。