Как я могу выйти из пакетного файла из подпрограммы?
Если я использую Команду выхода, я просто возвращаюсь к строке, где я назвал подпрограмму, и выполнение продолжается.
Вот пример:
@echo off
ECHO Quitting...
CALL :QUIT
ECHO Still here!
GOTO END
:QUIT
EXIT /B 1
:END
EXIT /B 0
Вывод:
Quitting...
Still here!
Обновление:
Это не надлежащий ответ, но я закончил тем, что делал что-то вроде:
@echo off
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
ECHO You shouldn't see this!
GOTO END
:SUBROUTINE_WITH_ERROR
ECHO Simulating failure...
EXIT /B 1
:HANDLE_FAIL
ECHO FAILURE!
EXIT /B 1
:END
ECHO NORMAL EXIT!
EXIT /B 0
Оператор двойного канала:
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
сокращение от:
CALL :SUBROUTINE_WITH_ERROR
IF ERRORLEVEL 1 GOTO HANDLE_FAIL
Я все еще любил бы знать, существует ли способ выйти непосредственно от подпрограммы вместо того, чтобы иметь необходимость заставить ВЫЗЫВАЮЩУЮ СТОРОНУ обработать ситуацию, но это, по крайней мере, сделало задание.
Обновление № 2: При вызове подпрограммы из другой подпрограммы, названной таким образом выше, я звоню из подпрограмм таким образом:
CALL :SUBROUTINE_WITH_ERROR || EXIT /B 1
Таким образом, ошибка распространяет назад до "основного", так сказать. Основная часть пакета может затем обработать ошибку с обработчиком ошибок GOTO: ОТКАЗ
Как насчет этой незначительной корректировки?
@echo off
ECHO Quitting...
CALL :QUIT
:: The QUIT subroutine might have set the error code so let's take a look.
IF ERRORLEVEL 1 GOTO :EOF
ECHO Still here!
GOTO END
:QUIT
EXIT /B 1
:END
EXIT /B 0
Вывод:
Quitting...
Технически это не выходит из подпрограммы. Скорее это просто проверяет результат подпрограммы и принимает меры оттуда.
Добавьте это к вершине Вашего пакетного файла:
@ECHO OFF
SETLOCAL
IF "%selfWrapped%"=="" (
REM this is necessary so that we can use "exit" to terminate the batch file,
REM and all subroutines, but not the original cmd.exe
SET selfWrapped=true
%ComSpec% /s /c ""%~0" %*"
GOTO :EOF
)
Затем можно просто звонить:
EXIT [errorLevel]
если Вы хотите выйти из всего файлаEXIT /B [errorLevel]
выходить из текущей подпрограммыGOTO :EOF
выходить из текущей подпрограммы