逻辑上,仅当外部 IF 语句为假时,才执行内部 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%"==""