Вопрос сформулирован плохо, но я думаю, что понимаю (особенно если сконцентрируюсь на названии)
Моя интерпретация вашей проблемы:
В различных точкахв вашем пакетном файле вы проверяете ОШИБКУ.Всякий раз, когда вы обнаруживаете ошибку, вы хотите выполнить некоторую стандартную обработку ошибок, а затем выйти из пакетного сценария.Вы попытались создать подпрограмму для выполнения стандартной обработки, но подпрограмма возвращается к вызывающей стороне вместо выхода из сценария.Ваш вопрос: как заставить принудительно завершить процедуру обработки ошибок вместо возврата к вызывающей стороне?
Ответ:
Если ни одно из ваших обнаружений ошибок не происходит в вызываемомподпрограммы, то вы можете просто ПОЛУЧИТЬ свой процессор ошибок вместо того, чтобы вызывать его.
Если вы хотите иметь возможность вызывать подпрограмму и выходить из другой вызываемой подпрограммы, тогда вы можете продолжать использовать оператор CALL
, но завершите процедуру обработки ошибок с помощью EXIT
вместо GOTO :EOF
или GOTO :END
.
Добавление в ответ на комментарий
Да, GOTO не может передавать параметры,и подпрограмма CALLed всегда будет возвращаться вызывающей стороне (если процедура не заканчивается EXIT)
И да, EXIT закроет текущую оболочку CMD, которая обычно закрывает окно консоли.
НО... вы можете заставить пакетный файл выполнить себя через другую оболочку CMD, чтобы EXIT не закрывал окно!
Единственный потенциальный недостаток, который я вижу, это chВремена для среды будут потеряны, как только завершится пакетный файл (и запускающая его оболочка CMD).Это может или не может быть проблемой для вас.
@echo off
if "%~1" equ "_GO_" goto :main
cmd /c ^""%~f0" _GO_ %*^"
exit /b
:main
shift /1
echo %%1=%1 %%2=%2
echo before call
call :exitRoutine
:: should not get here
echo after call
exit /b
:exitRoutine
echo exiting batch file witin exitRoutine
exit