Выйдите из пакетного файла от подпрограммы

Как я могу выйти из пакетного файла из подпрограммы?

Если я использую Команду выхода, я просто возвращаюсь к строке, где я назвал подпрограмму, и выполнение продолжается.

Вот пример:

@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: ОТКАЗ

20
задан 10.12.2009, 16:09

3 ответа

Как насчет этой незначительной корректировки?

@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...

Технически это не выходит из подпрограммы. Скорее это просто проверяет результат подпрограммы и принимает меры оттуда.

3
ответ дан 07.12.2019, 10:12

Добавьте это к вершине Вашего пакетного файла:

@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 выходить из текущей подпрограммы
21
ответ дан 07.12.2019, 10:12

Если Вы не хотите возвращаться из процедуры, не использовать call: вместо этого используйте goto.

@echo off
ECHO Quitting...
GOTO :QUIT
ECHO Will never be there!
GOTO END

:QUIT
EXIT /B 1

:END
EXIT /B 0
1
ответ дан 07.12.2019, 10:12

Теги

Похожие вопросы