使用带有批处理的选择命令我做错了啥?

Posted

技术标签:

【中文标题】使用带有批处理的选择命令我做错了啥?【英文标题】:What am i doing wrong using the Choice command with batch?使用带有批处理的选择命令我做错了什么? 【发布时间】:2021-08-04 22:09:56 【问题描述】:

这不是完整的代码,因为它大约有 1000 行长,但问题是,当我来到游戏的这一部分时

choice /c abc1 /n

当我按“a”时,它应该是“medicalbag”,但它的行为就像我按“1”并返回开始

当我按“b,c,1”时,它们都会转到“medicalbag”。

我找不到解决方案,我阅读了有关该命令的信息,显然它支持这些字母和数字,当我只用数字更改它们时它们工作得很好,但我真的不确定我在这里做错了什么.

: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

【问题讨论】:

它并没有像您想象的那样设置 %ERRORLEVEL%。请参阅SS64 on CHOICE 和SS64 on ERRORLEVEL 我不明白怎么了。 “接受用户对批处理文件的输入。选择允许从键盘捕获单个按键。”我不应该像以前那样做吗? CHOICE 仅将 ERRORLEVEL 设置为数值,而不是字符值。 IF ERRORLEVEL x 仅测试ERRORLEVEL 是否等于或大于 x。请阅读整个页面,而不仅仅是第一部分告诉您您想看到什么。 CHOICE 命令的帮助文件很漂亮 CLEAR 关于 ERRORLEVEL 的设置。 ERRORLEVEL 环境变量设置为从选项集中选择的键的索引。列出的第一个选项返回值 1,第二个选项返回值 2,依此类推。 您不明白什么?打开命令提示符并输入:choice /?. 我在示例中看到使用了字母,但是有没有其他方法可以捕获字母而不是数值? 【参考方案1】:

使用/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 开关。

【讨论】:

谢谢!这更有意义。【参考方案2】:

这是一个动态菜单系统示例,它将返回用户选择的值和该值的描述。

@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

【讨论】:

以上是关于使用带有批处理的选择命令我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

当使用带有 EF 4.1 Code First 的 ASP.NET MVC 3 时,我只能编辑主表,我做错了啥?

sectionName TableView - 我做错了啥?

重新加载 ng-repeat 数据失败,我做错了啥?

这个 MERGE / INSERT 查询我做错了啥?

在 Popover 中显示 ActionSheet - 我做错了啥?

子进程和 Python 我做错了啥? [复制]