Хотя все заинтересовавшиеся поднятым вопросом сами уже во всём разобрались, вернусь к нему, чтобы попытаться подвести итоги и сделать кое-какие уточнения.
wisgest пишет:Код ошибки, однако, устанавливается…
— уточню: код 1 устанавливается, если GOTO является одиночной комадой или последней командой внутри составной, или непосредственно за ними следуют оператор «||» или оператор «&&», после которого нет команд;
в противном случае, даже если следующая за GOTO (или за «(GOTO && что-то)») команда — лишь комментарий или пустая команда (ничего нет после «&»), текущее значение ERRORLEVEL не меняется.
wisgest пишет:Как видим, контекстом может быть не обязательно состояние ожидания интерпретатором ввода команд…
Вот совсем небольшой пример:
call :SUB
exit /b
:SUB
goto NOWHERE& echo %0& call echo %%0
echo Эта строка не будет выполнена.
— хотя первое ECHO и выведет «:SUB», т.к. подстановка %0 произведена заранее, команда с отложенным раскрытием покажет истинный контекст. Сказанное остаётся верным и при выносе подпрограммы в отдельный файл.
Rumata пишет:Пользы от этого никакой. К сожалению.
Не знаю, какая предпологалась польза, но если внешним контекстом является «голый» CMD.EXE, выполняющий команды из своего входного потока или ключей «/C» или «/K», то пользы я пока тоже не вижу;
если же «неправильное» GOTO встретится внутри подпрогаммы пакетного файла (находящейся в том же файле или вынесенной в отдельный), то возможны, по крайней мере, две небольшие пользы:
1) возврат не только из текущей, но и из вызвавшей её (под)программы с установкой кода возврата вызвавшей
goto NOWHERE 2>nul& exit /b 100
2) возврат из подпрограммы не в точку вызова, а на заданную метку вызвавшего пакетного файла (того же или отдельного)
goto NOWHERE 2>nul& goto LABEL
(в обоих случаях, если использовать несколько GOTO в никуда, то возможно поднятие на несколько уровней).
Второй приём можно было бы использовать, например, в теме «CMD/BAT: Возможность создания heredoc» для устранения избыточности из построения
call :heredoc LABEL & goto LABEL
Наконец, следует заметить, что, при преднамеренном использовании GOTO в никуда, лучше всего после GOTO не употреблять вообще ничего:
1) это нагляднее;
2) нет опасности попасть в существующую метку;
3) нет необходимости интерпретатору просматривать командный файл в поиске несуществующего.
При этом возможны два случая, отличающиеся лишь сообщением об ошибке (чтобы его увидеть замените NUL на CON):
1) «Не удается найти указанную метку пакетного файла - », если после GOTO есть хоть один пробел или приравненный к нему символ, например,
2) «Для команды GOTO в пакетном файле не указана метка перехода.», если лишних символов нет,