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

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

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

вот пример:

@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

оператор двойной трубы of:

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: FAILURE

30
задан Brown
16.05.2023 6:01 Количество просмотров материала 3575
Распечатать страницу

4 ответа

добавьте это в начало вашего пакетного файла:

@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
отвечен Merlyn Morgan-Graham 2023-05-17 13:49

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

@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
отвечен JMD 2023-05-17 16:06

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

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

:QUIT
EXIT /B 1

:END
EXIT /B 0
1
отвечен dolmen 2023-05-17 18:23

я помещаю обработку ошибок в свои пакетные файлы. Обработчики ошибок можно вызывать следующим образом:

CALL :WARNING "This is" "an important" "warning."

и вот конец пакетного файла:

::-------------------------------------------------------------------
::  Decisions
::-------------------------------------------------------------------
:INFO
IF "_DEBUG"=="true" (
  ECHO INFO: %~1
  IF NOT "%~2"=="" ECHO          %~2
  IF NOT "%~3"=="" ECHO          %~3
)
EXIT /B 0
:WARNING
ECHO WARNING: %~1
IF NOT "%~2"=="" ECHO          %~2
IF NOT "%~3"=="" ECHO          %~3
EXIT /B 0
:FAILURE
ECHO FAILURE: %~1
IF NOT "%~2"=="" ECHO          %~2
IF NOT "%~3"=="" ECHO          %~3
pause>nul
:END
ECHO Closing Server.bat script
FOR /l %%a in (5,-1,1) do (TITLE %TITLETEXT% -- closing in %%as&PING.exe -n 2 -w 1 127.0.0.1>nul)
1
отвечен djangofan 2023-05-17 20:40

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх