Тестирование на уровне ошибок сделано неправильно.
Есть две возможности:
@ECHO OFF
:BEGIN
ECHO 1 to quit or 2 to print hello and go back to this screen
CHOICE /C:12 /N
IF ERRORLEVEL 2 GOTO HELLO
IF ERRORLEVEL 1 EXIT /B
GOTO BEGIN
:HELLO
ECHO hello
GOTO BEGIN
См опорную статью Microsoft Testing for a Specific Error Level in Batch Files.
Пользователь партии должен нажать либо 1 или 2, так как в противном случае выполнение партии не будет продолжено. Поэтому тестирование для errorlevels может быть сделано от самого высокого до самого низкого с
if errorlevel X ...
, который означает, что если Равно больше или равно X затем выполнить команду (или командный блок).
Преимущество использования этого синтаксиса состоит в том, что он даже работает в командном блоке без необходимости использования замедленного расширения.
Вторая возможность:
@ECHO OFF
:BEGIN
ECHO 1 to quit or 2 to print hello and go back to this screen
CHOICE /C:12 /N
IF %ERRORLEVEL% == 1 EXIT /B
IF %ERRORLEVEL% == 2 GOTO HELLO
GOTO BEGIN
:HELLO
ECHO hello
GOTO BEGIN
Явно ссылки на переменную окружения ERRORLEVEL
, здесь с расширением до того IF оценивает состояние, порядок испытаний Errorlevel больше не имеет значения.
Недостатком этого метода является необходимость использования отсроченной расширения, если ВЫБОР и ERRORLEVEL оценки условия внутри блока команд, определенного с (
... )
.
Выполнить в командной строке окна if /?
и set /?
для справки о правильном использовании команд IF и SET соответственно получить информацию о задержанном расширении.
Возможно, но не рекомендуется использовать в качестве метки START
, поскольку это внутренняя команда интерпретатора команд Windows. Вы получаете неприятности при поиске START
, что означает метку и START
, что означает команду, когда ваш командный файл будет использовать когда-либо также команду START. По этой причине в качестве метки используется BEGIN
.
Также рекомендуется использовать команду EXIT всегда с параметром /B
по крайней мере, во время разработки пакетного файла для выхода только пакетной обработки, но не полностью выйти из процесса команды работает не зависят от вызывающей иерархии и опции, используемой при пуске cmd.exe
.
Это гораздо проще отлаживать пакетный файл, запустив его из в окне командной строки (cmd.exe
начал с опцией /K
держать окно консоли открытым) вместо двойного щелчка на командный файл (cmd.exe
начал с опцией /C
закрыть при завершении пакетного исполнения) при использовании exit /B
вместо exit
при открытии окна командной строки. Запустите в окне командной строки cmd /?
для получения дополнительной информации о параметрах интерпретатора команд Windows.
GOTO BEGIN
после того, как две оценки ошибок в реальном времени никогда не выполняются. Поэтому этот пакетный файл может быть записан также как:
@ECHO OFF
:BEGIN
ECHO 1 to quit or 2 to print hello and go back to this screen
CHOICE /C:12 /N
IF ERRORLEVEL 2 GOTO HELLO
EXIT /B
:HELLO
ECHO hello
GOTO BEGIN
Используйте% ERRORLEVEL% вместо ERRORLEVEL – DavidPostill
Да был мой плохой. Сожалею. – geisterfurz007