Куда 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
3 ответа
:EOF
предопределенная метка, как Microsoft объясняет в документации для команды GOTO. Вывод справки путем запуска в окне командной строки goto /?
объясняет также этот специальный ярлык для конца файла. Но эта предопределенная метка поддерживается только с расширениями команд, которые включены по умолчанию.
Вывод справки путем запуска в окне командной строки call /?
и, конечно, также документация для команды CALL объяснить, что goto :EOF
должен использоваться для выхода из подпрограммы с call :Label
,
Подпрограмма - это не что иное, как другой пакетный файл, встроенный в текущий пакетный файл, вызываемый командой call
, Если подпрограмма находится в конце пакетного файла, реальный конец файла помечает конец подпрограммы.
Но в пакетном файле может быть несколько подпрограмм.
Таким образом, команда необходима для интерпретатора команд, чтобы выйти из подпрограммы при достижении определенной строки в обработке команды и вернуться к вызывающей командной строке. goto :EOF
так же как exit /B
оба могут использоваться везде, чтобы либо выйти из подпрограммы, либо выйти из текущей обработки пакетного файла.
В указанном коде партии первый goto :EOF
необходим для выхода из обработки пакетного файла без нежелательного перехода к коду подпрограммы после завершения цикла.
Второй goto :EOF
в пакетном коде спрашивающий предназначен для выхода из подпрограммы и продолжения обработки в цикле FOR во второй строке. Он не завершает обработку командного файла, а только обработку подпрограммы.
Примечание 1: goto EOF
без двоеточия требует, чтобы действительно была строка, начинающаяся с :EOF
в командном файле, т.е. метка перехода EOF
должен существовать в файле. goto :EOF
всегда приводит к выходу из подпрограммы / пакетной обработки с включенными расширениями команд, даже если есть метка EOF
в командном файле из-за строки, начинающейся с :EOF
,
Примечание 2: Команда ВЫХОД без параметра /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 означает "Конец файла". Он используется, чтобы завершить работу скрипта без выполнения любой из приведенных ниже команд.
Как
GOTO
и
CALL
используют ту же функцию, чтобы найти ярлык, у вас есть возможность получить доступ к
:EOF
с участием
CALL
тоже:
CALL ::EOF
Такой же как
GOTO
(когда
CALL
с дополнительной точкой с запятой) фактический конец файла будет предпочтительной точкой, куда будет идти поток сценария. Если у вас есть собственная метка \ функция, определенная с помощью EOF, вы можете получить к ней доступ с помощью одной точки с запятой.
Хотя вызов
:EOF
не имеет особого смысла - вы не можете поместить код после конца файла, поэтому эта строка фактически ничего не делает (хотя это снизит производительность при анализе конца файла). И, как
GOTO
и
EXIT /B
это не будет работать без включенных расширений.