2016-05-29 2 views

ответ

25

:EOF является предопределенной меткой, как Microsoft объясняет в документации для команды GOTO. Вывод справки, запускаемый в окне командной строки goto /?, также объясняет эту специальную метку для Конец файла. Но эта предопределенная метка поддерживается только с включенными расширениями команд по умолчанию.

Вывод справки по работе в окне подсказки call /? команды и, конечно, также в документации по команде CALL объяснить и что goto :EOF следует использовать для выхода из подпрограммы с именем с call :Label.

Подпрограмма - это не что иное, как другой пакетный файл, встроенный в текущий пакетный файл с командой call. Если подпрограмма находится в конце командного файла, реальный конец файла отмечает конец подпрограммы.

Но в пакетном файле может быть несколько подпрограмм.

Поэтому команде командного интерпретатора требуется команда для выхода из подпрограммы при достижении определенной строки в обработке команд и возврате к процессу вызывающей команды. goto :EOF, а также exit /B могут использоваться как для выхода из подпрограммы, так и для выхода из текущей пакетной обработки.

В пакетном коде в вопросе первогоgoto :EOF необходим для обработки выхода пакетного файла без нежелательного падения до кода подпрограммы после окончания цикла.

второгоgoto :EOF в пакете код спрашивающего для выхода из подпрограммы и продолжить обработку в для петли во второй строке. Он не выходит из обработки командного файла, он выдает только подпрограмму.

Примечание 1:goto EOF без двоеточия требует, что есть на самом деле линия, начиная с :EOF в пакетном файле, то есть прыжок метка EOF должна существовать в файле. goto :EOF всегда приводит к завершению подпрограммы/пакетной обработки с включенными расширениями команд, даже если в пакетном файле есть метка EOF из-за строки, начинающейся с :EOF.

Примечание 2: Команда EXIT без параметра /B результатов всегда в выходе всей обработки команд не зависит от вызова иерархии и не зависят от того, как команды interpeter был запущен с параметром /K (держать открытой, используемые при открытии окна командной строки) или с /C (закрыть после завершения обработки команды, как используется при двойном щелчке командного файла). Поэтому exit без /B следует разумно использовать в пакетном файле (лучше всего: никогда).

Примечание 3:exit /B не работает с командными расширениями отключены, как показано на этом коде:

@echo off 
setlocal DisableExtensions 
echo Use command exit /B with command extensions disabled. 
exit /B 

Исполнительного этот пакетный файл из в командной строке результатов окна в выходе сообщения об ошибке:

система не может найти метку пакета указано - EOF

Другими словами exit /B точно так же, как goto :EOF и поэтому зависит от расширений команд. exit без /B работает всегда.

Примечание 4:ERRORLEVEL не влияет goto :EOF, но в документации Microsoft GOTO нема по этой теме. exit /B #ERRORLEVEL до #as documented от Microsoft. Однако явно выходящий из командного файла с конкретным кодом выхода обычно не требуется, поскольку ни goto :EOF, ни exit /B не изменяют текущее значение ERRORLEVEL.

Для получения дополнительной информации о ERRORLEVEL поведении см:

+0

Получил это большое спасибо! – s6398197atuser

+1

Текст справки при вводе 'cmd /?' Перечисляет все «команды», которые выполняются с помощью расширений команд, но «exit» is * not * указан; спасибо, что указали это! – aschipfl

0

: ВФ означает "Конец файла". Он используется для завершения скрипта без выполнения каких-либо команд ниже.

+0

спасибо! но как же происходит цикл? второй GOTO также говорит: eof не предполагал сказать GOTO: DO, например? – s6398197atuser

+3

@ s6398197atuser 'call' порождает дочерний поток, и выполнение текущего потока приостанавливается до завершения' call'. 'call: subroutine' запускается до тех пор, пока не будет достигнуто собственное' exit/b' или EOF, после чего выполнение будет возобновлено у вызывающего. Оставьте эхо, и вы можете посмотреть порядок выполнения команд, и, надеюсь, это будет иметь немного больше смысла. [См. Эту страницу] (http://ss64.com/nt/call.html) для получения дополнительной информации о 'call' и [этой странице] (http://www.dostips.com/DtTutoFunctions.php) для руководство по функциям пакетного сценария. – rojo

+0

@ Мичо, спасибо большое, я думаю, что получил! – s6398197atuser

5

GOTO :EOF является функционально эквивалентным до exit /B, но обе формы работают только при активизации Расширений. Тест на данный момент является очень простой:

setlocal DisableExtensions 
goto :EOF 

Сравнить предыдущий код против этого:

setlocal DisableExtensions 
exit /B 

Это означает, что GOTO :EOF возвращается к на ту же точку, гдеexit /B вернется.

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