Где 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

Ответ 1

: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 смотрите:

Ответ 2

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

setlocal DisableExtensions
goto :EOF

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

setlocal DisableExtensions
exit /B

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

Ответ 3

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

Ответ 4

Всего здесь n00b, но чем GOTO: EOF отличается от BREAK?