我很难理解 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 :exits
s 来终止 procs,而不是exit
终止封闭的cmd
shell。
示例输出:
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>
进一步阅读
- Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
- 如果- 有条件地执行命令。