为什么这个Choice命令不起作用(批处理文件)

时间:2017-08-22 21:49:28

标签: batch-file choice

我有这个

@echo off
:1
cls
echo Navigation: W-Up, S-Down, E-Enter
echo _________________________________
echo -(Option 1)
echo   Option 2
echo   Option 3
choice /c WSE /n
if ERRORLEVEL 1 goto 3
if ERRORLEVEL 2 goto 2
if ERRORLEVEL 3 goto opt1
:2
cls
echo Navigation: W-Up, S-Down, E-Enter
echo _________________________________
echo   Option 1
echo -(Option 2)
echo   Option 3
choice /c WSE /n
if ERRORLEVEL 1 goto 1
if ERRORLEVEL 2 goto 2
if ERRORLEVEL 3 goto opt2
:3
cls
echo Navigation: W-Up, S-Down, E-Enter
echo _________________________________
echo   Option 1
echo   Option 2
echo -(Option 3)
choice /c WSE /n
if ERRORLEVEL 1 goto 2
if ERRORLEVEL 2 goto 1
if ERRORLEVEL 3 goto opt3
:opt1
cls
echo You chose Option 1
pause >nul
exit
:opt2
cls
echo You chose Option 2
pause >nul
exit
:opt3
cls
echo You chose Option 3
pause >nul
exit

它应该做的是看起来像一个选择菜单,但由于某种原因它只是不断地从第2行到第9行循环“:1”它只是一遍又一遍地循环,为什么它这样做?我怎么做不这样做?

1 个答案:

答案 0 :(得分:0)

阅读choice /?

根据该帮助页面,应该以颠倒顺序检查errorlevel(s)。

choice /c WSE /n
if ERRORLEVEL 3 goto opt3
if ERRORLEVEL 2 goto 2
if ERRORLEVEL 1 goto 1

为什么呢?因为if ERRORLEVEL 1表示if %errorlevel% geq 1。或者,你可以这样做:

if %errorlevel% equ 1 goto 1
if %errorlevel% equ 2 goto 2
if %errorlevel% equ 3 goto opt3

或者findstr更加疯狂(但更安全)。

set errlvl=%errorlevel:~-1%
echo "%errlvl%"| findstr /l /x /i """1""" && goto :1
echo "%errlvl%"| findstr /l /x /i """2""" && goto :2
echo "%errlvl%"| findstr /l /x /i """3""" && goto :opt3

我们并不需要set声明,而是预防措施

再一次提醒一下,如果用户按下" WSE"中的键,将发出恼人的响亮的嘟嘟声。您可能需要查看my poorly title question以找出使其沉默的方法。