在 Windows Bat 文件中嵌套 IF

在 Windows Bat 文件中嵌套 IF

我很难理解 Windows .bat 脚本中的嵌套 IF 是如何工作的。我希望实现以下目标。我将向 bat 文件传递​​两个参数

如果第一个参数 = 0 并且如果第二个参数 = 0 则运行 proc1

如果第一个参数 = 0 并且第二个参数不为 0,则运行 proc2

如果第一个参数不为 0,则运行 proc 3

到目前为止我写的代码的骨架是

@echo off

IF %1% == 0 (
    IF %2% == 0 ( goto proc1
    ) ELSE ( goto proc2
)
  ELSE ( goto proc3
)

:proc1
echo in Proc1 0 0
pause
exit
:proc2
echo in Proc2 0 N0
pause
exit
:proc3
echo in Proc3 N0  0
pause
exit

问题是,前两个条件运行正常,但当第一个参数非零时,仍然会通过 proc1,而预期的是 proc3。我这里漏掉了什么?除非首先省略了参数,否则脚本不会给出任何错误。

答案1

对于您的用例,我实际上不确定您是否需要 ELSE,更不用说嵌套的 IF 了:

@echo off

IF NOT "%1%"=="0" (
    goto proc3
)
IF "%2%"=="0" ( 
    goto proc1
) 

goto proc2 

:proc1
echo in Proc1 0 0
pause
exit
:proc2
echo in Proc2 0 N0
pause
exit
:proc3
echo in Proc3 N0  0
pause
exit

如果由于某种原因你确实想要嵌套 IF,那么你会缺少一个括号:

您的批次:

IF %1% == 0 (
    IF %2% == 0 ( goto proc1
    ) ELSE ( goto proc2
)
***MISSING )***  ELSE ( goto proc3
)

应该工作的批次:

IF "%1%" == "0" (
    IF "%2%" == "0" ( 
    goto proc1
    ) ELSE ( 
    goto proc2
    )
) ELSE ( 
    goto proc3
)

答案2

我在这里遗漏了什么?

比较运算符==的结果总是细绳比较。

您需要使用EQU来执行数值比较。

使用以下批处理文件:

@echo off

IF NOT %1% EQU 0 (
    goto proc3
)
IF %2% EQU 0 ( 
    goto proc1
) 

goto proc2 

:proc1
echo in Proc1 0 0
pause
goto :exit
:proc2
echo in Proc2 0 N0
pause
goto :exit
:proc3
echo in Proc3 N0  0
pause
:exit

笔记:

  • 添加了一些goto :exitss 来终止 procs,而不是exit终止封闭的cmdshell。

示例输出:

F:\test>example 0 0
in Proc1 0 0
Press any key to continue . . .

F:\test>example 0 1
in Proc2 0 N0
Press any key to continue . . .

F:\test>example 1 0
in Proc3 N0  0
Press any key to continue . . .
F:\test>

进一步阅读

相关内容