使用CHOICE和CMD脚本

时间:2013-06-03 17:21:56

标签: batch-file cmd errorlevel

无法使此CHOICE脚本生效。任何人都可以提供任何见解吗?

@echo off

CHOICE /C:IRCQSH /T 10 /N /M "Waiting with choice..." /D H

IF ERRORLEVEL 0 ECHO "Default choice: Health"
IF ERRORLEVEL 1 ECHO "Install"
IF ERRORLEVEL 2 ECHO "Remove"
IF ERRORLEVEL 3 ECHO "Console"
IF ERRORLEVEL 4 ECHO "Quit"
IF ERRORLEVEL 5 ECHO "Start"
IF ERRORLEVEL 6 ECHO "Health"

pause

2 个答案:

答案 0 :(得分:3)

您需要更改语法以将ERRORLEVEL视为变量,并使用CMD相等语句,例如:

IF %ERRORLEVEL% EQU 0 ECHO "Default choice: Health"
IF %ERRORLEVEL% EQU 1 ECHO "Install"
IF %ERRORLEVEL% EQU 2 ECHO "Remove"
IF %ERRORLEVEL% EQU 3 ECHO "Console"
IF %ERRORLEVEL% EQU 4 ECHO "Quit"
IF %ERRORLEVEL% EQU 5 ECHO "Start"
IF %ERRORLEVEL% EQU 6 ECHO "Health"

您的代码失败的原因取自here

  

如果ERRORLEVEL n语句应该被读作IF Errorlevel> = number

     

     

如果错误级别为64

,则ERRORLEVEL 0将返回TRUE

答案 1 :(得分:1)

这里有几点:

  • 默认选项不会返回ERRORLEVEL为零,而是选择所选数字。在您的情况下,即H,默认值等于按ER,ERRORLEVEL为6
  • 正如LittleBobbyTables在答案中所说,采用ERRORLEVEL值的正确方法是将其包含在百分比中并使用EQU比较。但是,还有其他方法可以达到相同的效果。
  • 如果errorlevel值大于或等于给定数字,则IF ERRORLEVEL Number Command测试,因此您也可以使用此表单:

@echo off

CHOICE /C:IRCQSH /T 10 /N /M "Waiting with choice..." /D H

FOR %%E IN (6 5 4 3 2 1) DO IF ERRORLEVEL %%E GOTO LABEL-%%E

:LABEL-1 
ECHO "Install"
GOTO CONTINUE

:LABEL-2
ECHO "Remove"
GOTO CONTINUE

:LABEL-3
ECHO "Console"
GOTO CONTINUE

:LABEL-4
ECHO "Quit"
GOTO CONTINUE

:LABEL-5
ECHO "Start"
GOTO CONTINUE

:LABEL-6
ECHO "Health"

:CONTINUE
pause
  • 也许最简单的方法是定义一个数组并使用errorlevel值作为索引显示相应的元素:

@echo off
setlocal EnableDelayedExpansion

rem Create an array with the desired messages (selected by numeric index)
set index=0
for %%a in ("Install" "Remove" "Console" "Quit" "Start" "Health") do (
   set /A index+=1
   set elem[!index!]=%%a
)

CHOICE /C:IRCQSH /T 10 /N /M "Waiting with choice..." /D H
echo !elem[%ERRORLEVEL%]!
pause

有关批处理数组的进一步说明,请参阅:Arrays, linked lists and other data structures in cmd.exe (batch) script