2

无法使此 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
4

2 回答 2

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"

您的代码失败的原因是,取自这里

IF ERRORLEVEL n 语句应读作 IF Errorlevel >= number

IE

IF ERRORLEVEL 0 将在错误级别为 64 时返回 TRUE

于 2013-06-03T17:30:23.427 回答
2

这里有几点:

  • 默认选项不返回 ERRORLEVEL 为零,而是返回所选选项的编号。在您的情况下,即 H,默认等于按 H,ERRORLEVEL 为 6
  • 正如 LittleBobbyTables 在他的回答中所说,获取 ERRORLEVEL 值的正确方法是将其括在百分比中并使用 EQU 比较。但是,还有其他方法可以达到相同的结果。
  • 测试IF ERRORLEVEL Number Commanderrorlevel 值是否大于或等于给定数字,因此您也可以使用以下形式:

.

@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

有关 Batch 数组的进一步说明,请参见:cmd.exe (batch) 脚本中的数组、链表和其他数据结构

于 2013-06-03T19:27:17.537 回答