批处理文件IF语句仅使用第一个字符

时间:2018-10-28 13:43:03

标签: batch-file if-statement

不太确定我在做什么错。在大多数情况下,这是可行的。如果我只键入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

2 个答案:

答案 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