Я пытаюсь понять, где в коде точно возвращается GOTO :EOF
?
Вот код:
SET count=1
FOR /f "tokens=*" %%G IN (somefile.txt) DO (call :subroutine "%%G")
GOTO :EOF
:subroutine
echo %count%:%1
set /a count+=1
GOTO :EOF
Я пытаюсь понять, где в коде точно возвращается GOTO :EOF
?
Вот код:
SET count=1
FOR /f "tokens=*" %%G IN (somefile.txt) DO (call :subroutine "%%G")
GOTO :EOF
:subroutine
echo %count%:%1
set /a count+=1
GOTO :EOF
:EOF
- это предопределенная метка, как Microsoft объясняет в документации для команды GOTO. Вывод справки путем запуска в окне командной строки goto/?
объясняет также этот специальный ярлык для конца файла. Но эта предопределенная метка поддерживается только с расширениями команд, которые включены по умолчанию.
Вывод справки, запустив в командной строке окно call/?
и, конечно же, в документации по команде CALL объясняется, что goto :EOF
следует использовать для выхода из подпрограммы, вызываемой с помощью call :Label
.
Подпрограмма - это не что иное, как другой пакетный файл, встроенный в текущий пакетный файл, вызываемый с помощью call
команды. Если подпрограмма находится в конце пакетного файла, реальный конец файла помечает конец подпрограммы.
Но в пакетном файле может быть несколько подпрограмм.
Таким образом, команда необходима для интерпретатора команд, чтобы выйти из подпрограммы при достижении определенной строки в обработке команды и вернуться к вызывающей командной строке. goto :EOF
а также exit/B
могут использоваться везде, чтобы либо выйти из подпрограммы, либо выйти из обработки текущего пакетного файла.
В рассматриваемом пакетном коде первое goto :EOF
необходимо для выхода из обработки пакетного файла без нежелательного goto :EOF
к коду подпрограммы после завершения цикла.
Второе goto :EOF
в пакетном коде запрашивающего - для выхода из подпрограммы и продолжения обработки в цикле FOR во второй строке. Он не завершает обработку командного файла, а только обработку подпрограммы.
Примечание 1: для goto EOF
без двоеточия требуется, чтобы в командном файле действительно была строка, начинающаяся с :EOF
, т. EOF
В файле должна существовать метка перехода EOF
. goto :EOF
всегда приводит к выходу из подпрограммы/пакетной обработки с включенными расширениями команд, даже если в пакетном файле есть метка EOF
из-за строки, начинающейся с :EOF
.
Примечание 2: Команда EXIT без параметра /B
всегда приводит к выходу из всего командного процесса независимо от иерархии вызовов и независимо от того, как был запущен командный процессор Windows - с параметром /K
для сохранения cmd.exe
рабочем состоянии, как при открытии окна командной строки или клавиша /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
значение #
в соответствии с документацией Microsoft. exit/B #
может использоваться вместо goto :EOF
для выхода из подпрограммы с определенным кодом выхода, вычисленным в командной строке, вызывающей подпрограмму, как при использовании операторов &&
или ||
или по следующей команде после вызова командной строки с if errorlevel X
Однако явный выход из пакетного файла или подпрограммы с определенным кодом выхода обычно не требуется, поскольку ни goto :EOF
ни exit/B
изменяют текущее значение ERRORLEVEL
.
Подробнее о поведении ERRORLEVEL
смотрите:
GOTO :EOF
функционально эквивалентен exit /B
, но обе формы работают только при включенном расширении. Тест для этой точки очень прост:
setlocal DisableExtensions
goto :EOF
Сравните предыдущий код с этим:
setlocal DisableExtensions
exit /B
Это означает, что GOTO :EOF
возвращается в ту же точку, где будет возвращен exit /B
.
: eof означает "Конец файла". Он использовал для завершения script без выполнения каких-либо из приведенных ниже команд.
Всего здесь n00b, но чем GOTO: EOF отличается от BREAK?