我在批处理中使用 Choice 命令做错了什么?
What am i doing wrong using the Choice command with batch?
这不是完整的代码,因为它大约有 1000 行长,但是当我来到游戏的这一部分时,问题就来了
choice /c abc1 /n
当我按“a”时,它应该是“medicalbag”,但它的行为就像我按“1”然后返回开始
当我按“b、c、1”时,它们都会转到“医疗包”。
我找不到解决这个问题的方法,我阅读了有关该命令的信息,显然它支持这些字母和数字,当我只用数字更改它们时它们工作得很好,但我真的不确定我在做什么这里错了。
:bag
cls
echo *****************************
echo a) Medical supplies
echo b) Consumables
echo c) Weaponry
echo -----------------------------
echo 1) back
echo -----------------------------
choice /c abc1 /n
if %errorlevel% == a goto medicalbag
if %errorlevel% == b goto consumablebag
if %errorlevel% == c goto weaponrybag
if %errorlevel% == 1 goto start
:medicalbag
cls
echo *****************************
echo Bandages: %bandagecount%
echo -----------------------------
echo 1) back
echo -----------------------------
choice /c 1 /n
if %errorlevel% == 1 goto bag
:consumablebag
cls
echo *****************************
echo Canned food: %cannedfoodcount%
echo Purified water: %purifiedwatercount%
echo Dirty water: %dirtywatercount%
echo -----------------------------
echo 1) back
echo -----------------------------
choice /c 1 /n
if %errorlevel% == 1 goto bag
:weaponrybag
cls
echo *****************************
echo a) combatknife: %combatknifecount%
echo -----------------------------
echo 1) back
echo -----------------------------
choice /c a1 /n
if %errorlevel% == a goto combatknifecheck
if %errorlevel% == 1 goto bag
根据列表中键的位置返回使用/c
开关定义的选择键的错误级别。
与 /c abc1
:
keypress: errorlevels reuturned:
a 1
b 2
c 3
1 4
要获取文字按键,您需要使用 for /f loop
来捕获按键:
For /f "delims=" %%G in ('choice /n /c abc1')Do Echo(You pressed: %%G
- 注意 - 在使用 for 循环捕获按下的键时必须使用
/n
开关。
这是一个动态菜单系统的示例,它将 return 用户选择的值和该值的描述。
@echo off
setlocal EnableDelayedExpansion
CALL :MENU "Medical supplies" "Consumables" "Weaponry" "Back"
CALL :CHOSE
pause
goto :eof
REM ONLY FUNCTIONS BELOW HERE
:MENU
set /a "OptionNo=0"
set "choices="
FOR %%I IN (%*) do (
set /a OptionNo+=1
call :ResolveChar !OptionNo!
set "Option!retval!=%%~I"
set "choices=!choices!!retval!"
echo [!retval!] %%~I
)
GOTO :EOF
:ResolveChar
SETLOCAL
set "keys=_ABCDEFGHIJKLMNOPQRSTUVWXYZ"
set "_startchar=%1"
CALL SET "char=%%keys:~%_startchar%,1%%"
ENDLOCAL & SET "retval=%char%"
goto :eof
:CHOSE
choice /c !choices! /cs /m "Select Your Option: " /n
call :ResolveChar %errorlevel%
set "Option=!Option%retval%!"
echo You Selected: %retval% - %Option%
GOTO :EOF
这不是完整的代码,因为它大约有 1000 行长,但是当我来到游戏的这一部分时,问题就来了
choice /c abc1 /n
当我按“a”时,它应该是“medicalbag”,但它的行为就像我按“1”然后返回开始
当我按“b、c、1”时,它们都会转到“医疗包”。
我找不到解决这个问题的方法,我阅读了有关该命令的信息,显然它支持这些字母和数字,当我只用数字更改它们时它们工作得很好,但我真的不确定我在做什么这里错了。
:bag
cls
echo *****************************
echo a) Medical supplies
echo b) Consumables
echo c) Weaponry
echo -----------------------------
echo 1) back
echo -----------------------------
choice /c abc1 /n
if %errorlevel% == a goto medicalbag
if %errorlevel% == b goto consumablebag
if %errorlevel% == c goto weaponrybag
if %errorlevel% == 1 goto start
:medicalbag
cls
echo *****************************
echo Bandages: %bandagecount%
echo -----------------------------
echo 1) back
echo -----------------------------
choice /c 1 /n
if %errorlevel% == 1 goto bag
:consumablebag
cls
echo *****************************
echo Canned food: %cannedfoodcount%
echo Purified water: %purifiedwatercount%
echo Dirty water: %dirtywatercount%
echo -----------------------------
echo 1) back
echo -----------------------------
choice /c 1 /n
if %errorlevel% == 1 goto bag
:weaponrybag
cls
echo *****************************
echo a) combatknife: %combatknifecount%
echo -----------------------------
echo 1) back
echo -----------------------------
choice /c a1 /n
if %errorlevel% == a goto combatknifecheck
if %errorlevel% == 1 goto bag
根据列表中键的位置返回使用/c
开关定义的选择键的错误级别。
与 /c abc1
:
keypress: errorlevels reuturned:
a 1
b 2
c 3
1 4
要获取文字按键,您需要使用 for /f loop
来捕获按键:
For /f "delims=" %%G in ('choice /n /c abc1')Do Echo(You pressed: %%G
- 注意 - 在使用 for 循环捕获按下的键时必须使用
/n
开关。
这是一个动态菜单系统的示例,它将 return 用户选择的值和该值的描述。
@echo off
setlocal EnableDelayedExpansion
CALL :MENU "Medical supplies" "Consumables" "Weaponry" "Back"
CALL :CHOSE
pause
goto :eof
REM ONLY FUNCTIONS BELOW HERE
:MENU
set /a "OptionNo=0"
set "choices="
FOR %%I IN (%*) do (
set /a OptionNo+=1
call :ResolveChar !OptionNo!
set "Option!retval!=%%~I"
set "choices=!choices!!retval!"
echo [!retval!] %%~I
)
GOTO :EOF
:ResolveChar
SETLOCAL
set "keys=_ABCDEFGHIJKLMNOPQRSTUVWXYZ"
set "_startchar=%1"
CALL SET "char=%%keys:~%_startchar%,1%%"
ENDLOCAL & SET "retval=%char%"
goto :eof
:CHOSE
choice /c !choices! /cs /m "Select Your Option: " /n
call :ResolveChar %errorlevel%
set "Option=!Option%retval%!"
echo You Selected: %retval% - %Option%
GOTO :EOF