我有以下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.
。如果我设置了一个值,那么一切正常。
有人可以帮我弄清楚出了什么问题吗?
答案 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
永远不会回应,因为它必须解析并匹配所有()
对。一旦遇到语法错误就会失败。