我正在尝试制作一个菜单,但它不会关闭程序。如果你什么都不键入,然后按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
我无法在我的程序中使用它我正在进行
每日"菜单";问题
两个项目与您的代码保持原样:
-
如果在
if
语句中使用带括号的代码(code blocks
(,则每个(
必须由一个)
平衡。您的(
比)
多得多,因此if
语句将失败,因为它是无效语法。 -
如果只按Enter,则变量(在本例中为
menu
(保持不变,不会自动将set
设为无。
当您开始批量时,menu
实际上很可能是空的,但为了确保,请放入
set "menu="
在CCD_ 11语句之前。
但这样做的缺点是,如果在处理if
时menu
为空,例如
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