如果在BAT文件中嵌套了,我做错了什么?

时间:2013-08-20 18:54:17

标签: 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没有值,程序将报告The syntax of the command is incorrect.。如果我设置了一个值,那么一切正常。

有人可以帮我弄清楚出了什么问题吗?

2 个答案:

答案 0 :(得分:5)

逻辑上,仅当外部IF语句为false时才执行内部IF语句。但批处理在一次传递中解析括号内的复杂语句和块。解析块中的每一行必须是有效的语法,即使它没有被执行。

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

您可以通过将双方括在引号中来消除语法错误:IF "%j%" GTR "%ErrorThreshold%"。但那时比较不会是数字。

你可以改为向双方施加0。这将保留数字比较,只要数字的大小不超过有符号32位整数的限制,它就会起作用:

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

另一种选择是将复杂语句分解为多个语句,如果未使用GOTO定义变量,则跳过第二个IF:

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
  )
)

注意:您可以使用if not defined ErrorThreshold代替IF "%ErrorThreshold%"==""

答案 1 :(得分:2)

如果ErrorThreshold什么都没有,那么这一行:

IF %j% GTR %ErrorThreshold% (

扩展为:

IF 5 GTR (

这将导致语法错误,因为方程的右侧缺失。

编辑: @a_horse_with_no_name

它仍然必须解析命令的整个主体以理解第一个IF语句的完整范围。将样品减少到:

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

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