Куда 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 это не будет работать без включенных расширений.

Другие вопросы по тегам