Пакетный файл IF оператор только с использованием первого символа - PullRequest
0 голосов
/ 28 октября 2018

Не совсем уверен, что я делаю не так.По большей части это работает.Если бы я набрал только 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 голосов
/ 29 октября 2018

С кодом, который вы взяли, я не могу повторить ошибку, однако я помню, что сталкивался с той же самой проблемой очень давно.

Ответ - кавычки;просто добавьте его, и вы избежите более сложного кода:

: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=

Пользователь НЕ вводит ничего, только нажимает return .Код будет двигаться дальше:

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
0 голосов
/ 28 октября 2018

Как выяснилось, в коде были остатки, которые нужно было удалить.

IF NOT "%ans%" == "" SET ans=%ans:~0,1%
IF "%ans%" == "1" GOTO opt1

Я не совсем уверен, что установила первая строка, однако удаление этой проблемы решило проблему.

Спасибо за помощь, высоко ценится!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...