2017-01-01 2 views
-1

У меня возник вопрос о том, почему эта команда выбора не будет работать. Я смотрел на этот сайт и сравнить все мои сценарии, и я просто не могу понять, почему он не будет работать http://www.computerhope.com/issues/ch001674.htmкоманда выбора партии не работает

@ECHO OFF 
:START 
echo 1 to quit or 2 to print hello and go back to this screen 
CHOICE /C:12 /N 
IF ERRORLEVEL ==1 GOTO QUIT 
IF ERRORLEVEL ==2 GOTO HELLO 
GOTO :START 
:QUIT 
EXIT 
:HELLO 
ECHO hello 
GOTO :END 
:END 
+1

Используйте% ERRORLEVEL% вместо ERRORLEVEL – DavidPostill

+0

Да был мой плохой. Сожалею. – geisterfurz007

ответ

0

Я сделал несколько изменений и удалить ненужный код.

@ECHO OFF 
:START 
CLS 
ECHO=1 to quit or 2 to print hello and go back to this screen 
CHOICE /C 12 /N 
IF ERRORLEVEL 2 (CALL :HELLO & GOTO START) 
EXIT 
:HELLO 
ECHO=hello 
TIMEOUT 2 1>NUL 
0

Тестирование на уровне ошибок сделано неправильно.

Есть две возможности:

@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 
0

Simpler:

@ECHO OFF 
:START 
echo 1 to quit or 2 to print hello and go back to this screen 
CHOICE /C 12 /N 
GOTO OPTION-%ERRORLEVEL% 

:OPTION-1 Quit 
EXIT 

:OPTION-2 Hello 
ECHO hello 
GOTO START 
+0

он делает;) спасибо – Juggler

Смежные вопросы