试图制作一个菜单,当只键入回车键时不会崩溃



我正在尝试制作一个菜单,但它不会关闭程序。如果你什么都不键入,然后按enter键,它将再次进入菜单,你可以用一个有效的数字重试

:menu
echo.
echo 1- Tools
echo 2- Setting
echo 3- Games
echo 4- Info
echo x- Exit
set /p menu=?
if %menu%==1 (
goto tool
) else (
if %menu%==2 (
goto settings
) else (
if %menu%==3 (
goto game
) else (
if %menu%==4 (
goto info
) else (
if %menu%==x )
goto exits
) else (
goto menu
:tool
title tools by gloxidia
pause
:settings
title settings by gloxidia
pause
:game
title game by gloxidia
pause
:exits
title exit by gloxidia
exit

我无法在我的程序中使用它我正在进行

每日"菜单";问题

两个项目与您的代码保持原样:

  1. 如果在if语句中使用带括号的代码(code blocks(,则每个(必须由一个)平衡。您的()多得多,因此if语句将失败,因为它是无效语法。

  2. 如果只按Enter,则变量(在本例中为menu(保持不变,不会自动将set设为

当您开始批量时,menu实际上很可能是空的,但为了确保,请放入

set "menu="

在CCD_ 11语句之前。

但这样做的缺点是,如果在处理ifmenu为空,例如

if %menu%==2 (

将被解释为

if ==2 (

这是无效语法。

通常,经典的治疗方法是对进行编码

if "%menu%"=="2" (

其中引号都包含在比较中,并部分清除输入,以便现在可以正确解释包含空格的值。

但是(再次(存在问题。输入是不受控制的,因此您可以输入"hello"hello%hello%he"llo,这都会导致if语句出现问题,即使使用了if "%menu%"=="2"语法。

因此,解决方案是使用choice——SO上有很多可用的示例——只需使用search功能即可。

此外,请考虑您的代码结构和逻辑。一个长级联的CCD_ 22序列是一场噩梦。

考虑

if "%menu%"=="2" (goto somewhere)
rem MENU must be "not 2" to reach here
if "%menu%"=="3" (goto somewhereelse)
rem MENU must be "neither 2 nor 3" to reach here
if "%menu%"=="4" (goto somewhereelseagain)
rem MENU must be "neither 2,3 nor 4" to reach here

但实际上,使用choice会更好。

主要问题是使用所有不必要的if/else块。我添加了一些缩进,希望能更清楚地向您显示发生了什么,但实际上您打开了许多括号,但没有关闭它们。

:Menu
Set "MenuItem="
Echo=
Echo 1- Tools
Echo 2- Setting
Echo 3- Games
Echo 4- Info
Echo X- Exit
Set /P "MenuItem=?"
If "%MenuItem%" == "1" (
GoTo Tools
) Else (
If "%MenuItem%" == "2" (
GoTo Settings
) Else (
If "%MenuItem%" == "3" (
GoTo Games
) Else (
If "%MenuItem%" == "4" (
GoTo Info
) Else (
If /I "%MenuItem%" == "X" (
GoTo Exits
) Else (
GoTo Menu
)
)
)
)
)
:Tools
Title Tools by Gloxidia
Pause
GoTo Exits
:Settings
Title Settings by Gloxidia
Pause
GoTo Exits
:Games
Title Games by Gloxidia
Pause
GoTo Exits
:Info
Title Info by Gloxidia
Pause
:Exits
Title Exits by Gloxidia
Pause
Exit /B

为了帮助保护变量,对于一些有毒字符和空输入,我在If比较的两侧添加了双引号。此外,为了防止代码在您注意到之前循环通过所有剩余的命令和exit,我添加了一些GoTo命令,并将Exit更改为Exit /B

这里,它再次没有不必要的If/Else命令块。

:Menu
Set "MenuItem="
Echo=
Echo 1. Tools
Echo 2. Settings
Echo 3. Games
Echo 4. Info
Echo X. Exit
Set /P "MenuItem=?"
If "%MenuItem%" == "1" GoTo Tools
If "%MenuItem%" == "2" GoTo Settings
If "%MenuItem%" == "3" GoTo Games
If "%MenuItem%" == "4" GoTo Info
If /I "%MenuItem%" == "X" GoTo Exits
GoTo Menu
:Tools
Title Tools by Gloxidia
Pause
GoTo Exits
:Settings
Title Settings by Gloxidia
Pause
GoTo Exits
:Games
Title Games by Gloxidia
Pause
GoTo Exits
:Info
Title Info by Gloxidia
Pause
:Exits
Title Exits by Gloxidia
Pause
Exit /B

上述代码最大的问题是使用了错误的命令,set /p不是用于接受短列表中已知单个字符输入的正确命令。

您应该使用的是choice命令实用程序:

:Menu
Echo=
Echo 1. Tools
Echo 2. Settings
Echo 3. Games
Echo 4. Info
Echo X. Exit
%SystemRoot%System32choice.exe /C 1234X
If ErrorLevel 5 GoTo Exits
If ErrorLevel 4 GoTo Info
If ErrorLevel 3 GoTo Games
If ErrorLevel 2 GoTo Settings
:Tools
Title Tools by Gloxidia
Pause
GoTo Exits
:Settings
Title Settings by Gloxidia
Pause
GoTo Exits
:Games
Title Games by Gloxidia
Pause
GoTo Exits
:Info
Title Info by Gloxidia
Pause
:Exits
Title Exits by Gloxidia
Pause
Exit /B

问题的确切答案是使用else (,但从不关闭括号。

你可以直接修复rhis,但我建议你遵循这个q和其他q中的一些建议。

只需修复现有的批处理脚本:

umber that works
:menu
echo.
echo 1- Tools
echo 2- Setting
echo 3- Games
echo 4- Info
echo x- Exit
set /p "menu=?"
if "%menu%" EQU "1" ( goto :tool ) else (
if "%menu%" EQU "2" ( goto :settings ) else (
if "%menu%" EQU "3" ( goto :game ) else (
if "%menu%" EQU "4" ( goto :info ) else (
if /I "%menu%" EQU "x" ( goto :exits )
)
)
)
)
Goto :Menu
:tool
title tools by gloxidia
pause
Goto :eof
:settings
title settings by gloxidia
pause
Goto :eof
:game
title game by gloxidia
pause
Goto :eof
:exits
title exit by gloxidia
Echo=I can't get it to work
Pause
Goto :eof

备选方案:

您可以放弃GOTO :label部分,在嵌套的if语句中编写代码

也许你有rhem是有充分理由的,所以:

你可以直接调用标签,忽略最好的IF,使其更加精简。

这是一个精简的替代



UGH even my edits saying I'm annoyed seem to have screwed up, its very late and I am on mobile, I just need to relax and not spend all night qriting this

相关内容

  • 没有找到相关文章

最新更新