Ваша проблема в том, что вы игнорируете двойные кавычки. Если конечный пользователь не введет "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