批量选择命令将不起作用

batch choice command will not work

我有一个关于为什么这个选择命令不起作用的问题。我查看了这个站点并比较了我所有的脚本,但我无法弄清楚为什么它不起作用 http://www.computerhope.com/issues/ch001674.htm

@ECHO OFF
:START
echo 1 to quit or 2 to print hello and go back to this screen
CHOICE /C:12 /N
IF ERRORLEVEL ==1 GOTO QUIT
IF ERRORLEVEL ==2 GOTO HELLO
GOTO :START
:QUIT
EXIT
:HELLO 
ECHO hello
GOTO :END
:END

我做了一些更改并删除了不必要的代码。

@ECHO OFF
:START
CLS
ECHO=1 to quit or 2 to print hello and go back to this screen
CHOICE /C 12 /N
IF ERRORLEVEL 2 (CALL :HELLO & GOTO START)
EXIT
:HELLO 
ECHO=hello
TIMEOUT 2 1>NUL

错误级别测试错误。

有两种可能:

@ECHO OFF

:BEGIN
ECHO 1 to quit or 2 to print hello and go back to this screen
CHOICE /C:12 /N
IF ERRORLEVEL 2 GOTO HELLO
IF ERRORLEVEL 1 EXIT /B
GOTO BEGIN

:HELLO
ECHO hello
GOTO BEGIN

请参阅 Microsoft 支持文章 Testing for a Specific Error Level in Batch Files

批处理用户必须按 1 或 2,否则不会继续执行批处理。因此可以使用

从最高到最低来测试错误级别
if errorlevel X ...

这意味着如果错误级别大于或等于 X 则执行命令(或命令块)。

使用这种语法的好处是它甚至可以在命令方块中工作而无需使用延迟扩展。

第二种可能是:

@ECHO OFF

:BEGIN
ECHO 1 to quit or 2 to print hello and go back to this screen
CHOICE /C:12 /N
IF %ERRORLEVEL% == 1 EXIT /B
IF %ERRORLEVEL% == 2 GOTO HELLO
GOTO BEGIN

:HELLO
ECHO hello
GOTO BEGIN

通过显式引用环境变量 ERRORLEVEL,这里在 IF 评估条件之前进行扩展,错误级别测试的顺序不再重要。

这种方法的缺点是如果CHOICE和错误级别评估条件在用(定义的命令块内需要使用延迟扩展...... ).

运行 在命令提示符 window if /?set /? 中获取有关正确使用命令的帮助 IFSET分别获取延迟扩容信息

可以但不建议用作标签 START,因为这是 Windows 命令解释器的内部命令。当您的批处理文件将使用命令 START 时,您会发现 START 表示标签,START 表示命令。因此 BEGIN 被用作标签。

还建议使用命令 EXIT 始终带有参数 /B 至少在开发批处理文件期间仅退出批处理,但不要完全退出运行 命令进程独立于启动时使用的调用层次结构和选项 cmd.exe

在命令提示符 window 中通过 运行 调试批处理文件要容易得多(cmd.exe 从选项 /K 开始以保持控制台 window 打开)而不是双击批处理文件(cmd.exe 以选项 /C 开始以在批处理完成时关闭)使用 exit /B 而不是仅 exit 作为命令提示符 window 保持打开状态。 运行 在命令提示符 window cmd /? 中获取有关 Windows 命令解释器选项的详细信息。

GOTO BEGIN 在两个错误级别评估之后实际上从未在这里执行过。因此这个批处理文件也可以写成:

@ECHO OFF

:BEGIN
ECHO 1 to quit or 2 to print hello and go back to this screen
CHOICE /C:12 /N
IF ERRORLEVEL 2 GOTO HELLO
EXIT /B

:HELLO
ECHO hello
GOTO BEGIN

更简单:

@ECHO OFF
:START
echo 1 to quit or 2 to print hello and go back to this screen
CHOICE /C 12 /N
GOTO OPTION-%ERRORLEVEL%

:OPTION-1  Quit
EXIT

:OPTION-2  Hello
ECHO hello
GOTO START