Я пытаюсь понять, где в коде точно возвращается 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?