如果用户不想停止启动报告,我试图在批处理脚本中使用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语句替换了报告命令,但它仍然无法正常工作
答案 0 :(得分:4)
您已找到少数几个.cmd
和.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
行的顺序,以便正确的行是唯一执行的行。
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
语法。
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