不太确定我在做什么错。在大多数情况下,这是可行的。如果我只键入1,则转到opt1。
问题是,如果我键入“ 11”,“ 1111”或什至是“ 1234567”,它总是进入opt1。唯一似乎不选择opt1的情况是第一个数字不是1时。
同样,输入21将选择选项2。我能够使其按预期方式工作的唯一方法(仅输入1、2或3选择相应的选项)是省略IF NOT语句。
有人能指出我正确的方向吗?
@ECHO OFF
CLS
:MAIN_MENU
ECHO Welcome Menu
ECHO.
ECHO 1 - Option 1
ECHO 2 - Option 2
ECHO 3 - Option 3
ECHO.
SET ans=
SET /P ans="Select your option and then press ENTER: "
IF NOT "%ans%" == "" SET ans=%ans:~0,1%
IF "%ans%" == "1" GOTO opt1
IF "%ans%" == "2" GOTO opt2
IF "%ans%" == "3" GOTO opt3
ECHO "%ans%" is not a valid option, please try again!
ECHO.
PAUSE
CLS
GOTO MAIN_MENU
:opt1
ECHO This is option 1
PAUSE
CLS
GOTO MAIN_MENU
:opt2
ECHO This is option 2
PAUSE
CLS
GOTO MAIN_MENU
:opt3
ECHO This is option 3
PAUSE
CLS
GOTO MAIN_MENU
答案 0 :(得分:0)
事实证明,代码中有一些残留物需要删除。
IF NOT "%ans%" == "" SET ans=%ans:~0,1%
IF "%ans%" == "1" GOTO opt1
我不确定第一行的设置是什么,将其删除可以解决问题。
感谢所有帮助,非常感谢!
答案 1 :(得分:0)
使用您剪切的代码,我无法复制该错误,但是,我记得很久以前就遇到过同样的问题。
答案是引号;只需添加它,您就可以避免使用更复杂的代码:
:input
cls
set ans=:
set /p ans=
if "%ans%" equ "1" (
goto opt1
) else (
goto input
)
:opt1
echo success!
编辑:关于设置的第一个 ans ,它是清理外壳内存。有时可能会将变量存储在Windows内存中,即使您没有对 set / p 变量输入任何内容,而仅按 return ,该批处理仍将检查变量,并且已经在内存中预先设置了一个值。示例:
set /p option=
用户输入“ 1”。结果,Windows将存储 option = 1 或%option%,结果为 1 。 因此,即使您没有输入任何内容,下一个代码也会向前移动,因为答案已预先存储在内存中。
set /p option=
用户不输入任何内容,仅按返回。代码将继续:
if "%option%" equ "1" do (
echo %option% is equal to 1 because it was previously stored.
)
编辑:这是代码,带有注释和解释:
@echo off
:main_menu
cls
echo Welcome menu
echo.
echo 1 - option 1
echo 2 - option 2
echo 3 - option 3
echo.
rem Blank "ans" will clean the memory for a previous set value.
set ans=
rem You can either quote the whole variable with its option, ot not quote it at all.
rem However, its always better to quote it, as follows.
set /p "ans=select your option and then press enter:"
if "%ans%" == "1" goto opt1
if "%ans%" == "2" goto opt2
if "%ans%" == "3" goto opt3
rem The following line will force a loop to main menu if only return is pressed; blank options will not display message.
if "%ans%" == "" goto main_menu
rem In case that another option rather than 1, 2 or 3 are pressed, the loop will warn you, and then return to main menu.
echo "%ans%" is not a valid option, press any key to try again!
pause > nul
goto main_menu
:opt1
cls
echo this is option 1
pause
goto main_menu
:opt2
cls
echo this is option 2
pause
goto main_menu
:opt3
cls
echo this is option 3
pause
goto main_menu
关于%ans:~0,1%
,是将字符串限制在某个位置。
因此,例如,%any_variable:~0,5%
在说“从字符0
开始的字符串,然后继续到字符5
。”您可以在以下示例中进行尝试。请注意,所有echo
行都将键入相同的文本:
@echo off
set example=Batch files are kinda cool
echo %example%
echo %example:~0,11% are kinda cool
echo Batch files %example:~12%
pause