windows – Exit a batch script that called another batch script – Stack Overflow

Analysis

Как самостоятельная команда, EXIT /B эквивалентна EXIT /B%errorlevel% при условии, что%errorlevel% соответствует текущему уровню ошибок. EXIT /B без необязательного параметра errorlevel не изменяет уровень ошибки.

Но есть некоторые обстоятельства, при которых это может быть не так:

Exit batch script from inside a function

Most solutions only work for 2 stack levels or with on-screen error messages.
So I came up with two solutions and I think both are better than what I’ve seen around here.

Р ЕШЕНИЕ ДЛЯ СЛОЖНЫХ СКРИПТОВ, КОТОРОЕ НЕ ИСПОЛЬЗУЕТ SETLOCAL ИЛИ ERRORLEVEL

Когда это средство подходит,

  • you have too many recursive or conditional functions not knowing exactly when the program will terminate
  • you don’t care about variables that stay in the environment
  • you don’t care about errorLevel
CALL :leave 2>nul
:leave
()
GOTO :eof

Псевдопараметр 2>nul отправит сообщения об ошибках в void, подавляя ошибки из этого блока кода, а call:leave переместит его на уровень стека. После этого () выдаст фатальную ошибку, которая приведет к аварийному завершению программы.

You can even remove your variables by setting SET blank or putting ENDLOCAL in the main before CALL :leave.
But in a complex program you wouldn’t know when to do this. But in this case, I came up with a better solution…

Я уверен, что этот код (GOTO) 2>nul & ENDLOCAL & EXIT /b%yourCode% уже встречался, но он завершает только предыдущую функцию, которая его вызвала, и текущую функцию. Если у вас есть несколько функций, вызывающих друг друга на стеке, это не сработает. Таким образом, вы можете создать ряд ошибок:

(GOTO) 2>nul & (GOTO) 2>nul & (GOTO) 2>nul & ENDLOCAL & EXIT /b

:/>  ❶ Как обновить раздачу 🚩 запрещенные раздачи 🚩 Интернет 🚩 Другое

Вы не знаете, сколько нужно повторений, а если переборщить, то можно даже убить:main и выдать exit /b, чтобы закрыть консоль. Далее, у меня есть

Р ЕШЕНИЕ СЛОЖНЫХ СКРИПТОВ С ПОМОЩЬЮ SETLOCAL И ERRORLEVEL

Когда это средство подходит,

  • Имеет слишком много рекурсивных или условных функций, не зная точно, когда программа закончится
  • Не хочет постоянных переменных
  • Проверяет errorLevel (необязательно).
SET dummy=iAmDefined
FOR /l %%i in (0, 1, 1000) do (
  IF defined dummy (
    (GOTO) 2>nul & IF NOT defined dummy (CMD /c EXIT /b %yourExitCode%)
  )
)

It won’t run a thousand times, but only as many times as necessary until !dummy! miss the assignment.
You don’t need to enable EnableDelayedExpansion unless you want to debug the !dummy! echo.

Example:

@ECHO off
SETLOCAL EnableDelayedExpansion
SET dummy=iAmDefined

CALL :func3

:func1
ECHO i'm in func1
CALL :leave 2>nul
::GOTO :eof

:func2
ECHO i'm in func2
CALL: func1
::GOTO :eof

:func3
ECHO i'm in func3
CALL: func2
::GOTO :eof

:leave
ECHO ===leaving===
FOR /l %%i in (1, 1, 1000) of (
  IF defined dummy (
    (GOTO) & ECHO %%i !dummy! & IF NOT defined dummy (CMD /c EXIT /b 555)
  )
)
::GOTO :eof
::ENDLOCAL

Выход e Обоснование:

             -- 1 call  (called func3)
i'm in func3 -- 2 calls (called func2)
i'm in func2 -- 3 calls (called func1)
i'm in func1 -- 4 calls (called leave)
===leaving===
1 iAmDefined -- rollback :leave
2 iAmDefined -- rollback :func3
3 iAmDefined -- rollback :func2
4 iAmDefined -- rollback :func1
5 !dummy!    -- rollback :main before unset dummy
                new CMD and exit after unset dummy

At the 5 dummy it was still set before the (GOTO), but the ECHO was after.
The :EOF are commented to ilustrate that these gotoes are not used

Test.bat

rem Test1.bat will exit with error code.
call test1.bat
rem Want script to stop if test1.bat errors.
call test2.bat

Test1.bat

rem Can I get test.bat to terminate from inside test1.bat?
exit /b 1

Tl;dr

Хотя обычно разницы быть не должно, если вы хотите выйти без изменения уровня ошибки, exit /b%errorlevel% строго хуже, чем exit /b.

:/>  Как узнать какой Виндовс на компьютере стоит

Windows 7 exit batch file when command fails

Да, решение существует. Проверка кода возврата требуется в соответствии с кодексом.

SET EXITCODE=0

copy source1 dest1
call someFile1.bat
if ERRORLEVEL 1 goto Failed
copy source2 dest2
call someFile2.bat
if ERRORLEVEL 1 goto Failed
copy source3 dest3
goto Success

:Failed
set EXITCODE=1
:Success
EXIT /B %EXITCODE%

Это будет еще один оператор if, если вы хотите проверить, что команды COPY функционируют.

Оставьте комментарий

Adblock
detector