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