"如果ERRORLEVEL"链设置错误的价值

时间:2016-08-01 19:48:36

标签: windows batch-file

如果用户不想停止启动报告,我试图在批处理脚本中使用choice命令来获取默认输入。我编写了下面的脚本,但不是等待10秒并开始报告,而是反复循环回显代码的第一行直到我杀死脚本。我有什么不对劲吗?

我的代码:

CHOICE /C YN /N /T 10 /D N /M "Run Report Y or N?"
IF ERRORLEVEL 1 SET REPORT=RunTheReport:
IF ERRORLEVEL 2 SET REPORT=DontRunIt:

ECHO You chose to run %REPORT%

P.S:我用echo语句替换了报告命令,但它仍然无法正常工作

2 个答案:

答案 0 :(得分:4)

您已找到少数几个.cmd.bat之间差异很重要的实例之一。

当您将该代码保存到名为 script.bat 的文件时,您发布的示例工作正常。

script.bat

CHOICE /C YN /N /T 10 /D N /M "Run Report Y or N?"
IF ERRORLEVEL 1 SET REPORT=RunTheReport
IF ERRORLEVEL 2 SET REPORT=DontRunIt

ECHO You chose to run %REPORT%
  • 当用户按下Y时,错误级别设置为1.第一个IF行匹配并设置REPORT=RunTheReport。第二行IF行不匹配,最终结果为“运行”。
  • 当用户按下N时,errorlevel设置为2.第一个IF行匹配并设置REPORT=RunTheReport。第二个IF行匹配并设置REPORT=DontRunIt。最终结果是“不要跑”。

.bat文件中,IF ERRORLEVEL梯形图将继续并执行每个匹配的SET行。 最后匹配SET将是使用的。

如果将相同的代码保存到名为 script.cmd 的文件中,则CMD的行为略有不同。一个区别是SET命令现在在成功设置变量时将ERRORLEVEL设置为0。

  • 当用户按下Y时,错误级别设置为1.第一个IF行匹配并设置REPORT=RunTheReport。第二行IF行不匹配,最终结果为“运行”,就像.bat一样。
  • 当用户按下N时,错误级别设置为2.第一个IF行匹配,设置REPORT=RunTheReport,并将ERRORLEVEL设置为0.第二个{{ 1}}行然后不匹配。最终结果也是Run,这是错误的。

IF文件中,只会运行第一个匹配的.cmd行。

因此,如果您的文件以SET扩展名命名,则必须颠倒.cmd行的顺序,以便正确的行是唯一执行的行。

script.cmd

IF ERRORLEVEL

有一种简单的方法可以避免此问题,并使您的代码在两种类型的文件中都能正常工作。不推荐使用CHOICE /C YN /N /T 10 /D N /M "Run Report Y or N?" IF ERRORLEVEL 2 SET REPORT=DontRunIt IF ERRORLEVEL 1 SET REPORT=RunTheReport ECHO You chose to run %REPORT% 语法。这很令人困惑,因为它匹配大于或等于,而不是相等。相反,请使用较新的IF ERRORLEVEL N语法。

SCRIPT2。{蝙蝠| CMD}

IF %errorlevel% EQU N

答案 1 :(得分:1)

另存为 test.bat 并运行此脚本。它运作良好。编辑以显示可能的不同方法。它运行得更快:

@echo off
CHOICE /C YN /N /T 10 /D N /M "Run Report Y or N?"
IF "%errorlevel%"=="2" (SET "REPORT=DontRunIt:"
) else (SET "REPORT=RunTheReport:")
ECHO You chose to run %REPORT%
timeout 5
exit /b