Пакетное GoTO дает мне тот же вывод? - PullRequest
1 голос
/ 09 февраля 2020

Вот код, который я использую:

@echo off

:default
set /p cmd= "1 or 2"
if %cmd%=="1" goto one
if %cmd%=="2" goto two

:one
echo "1 worked"
goto default

:two
echo "2 worked"
goto default

Тем не менее, я получаю вывод «1 работал» независимо от того, что я вставил. Кто-нибудь знает, что я делаю неправильно?

1 Ответ

1 голос
/ 09 февраля 2020

Ваша проблема в том, что вы игнорируете двойные кавычки. Если конечный пользователь не введет "1" или "2", то обе стороны сравнения == никогда не будут совпадать, и ваш код всегда будет пропускать обе команды if и переходить к :one. Исправление состоит в том, чтобы гарантировать, что обе стороны сравнения заключены в двойные кавычки.

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

. В этом примере используется не рекомендуемый метод Set /P:

@Echo Off

:default
Set "num="
Set /P "num=1 or 2"
If "%num%" == "2" GoTo two
If Not "%num%" == "1" GoTo default
Echo "1 worked"
GoTo default

:two
echo "2 worked"
GoTo default

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


Вместо этого используется рекомендуемая команда Choice:

@Echo Off

:default
"%__AppDir__%choice.exe" /C 12
If ErrorLevel 2 GoTo two
Echo "1 worked"
GoTo default

:two
Echo "2 worked"
GoTo default

В качестве альтернативы вы можете использовать уровень ошибки в качестве GoTo:

@Echo Off

:default
"%__AppDir__%choice.exe" /C 12
GoTo Label%ErrorLevel% 2>NUL||GoTo default

:Label1
Echo "1 worked"
GoTo default

:Label2
Echo "2 worked"
GoTo default
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...