从子程序退出批处理文件

Bro*_*own 22 batch

如何从子程序内部退出批处理文件?

如果我使用 EXIT 命令,我只需返回到我调用子例程的行,然后继续执行。

下面是一个例子:

@echo off
ECHO Quitting...
CALL :QUIT
ECHO Still here!
GOTO END

:QUIT
EXIT /B 1

:END
EXIT /B 0
Run Code Online (Sandbox Code Playgroud)

输出:

Quitting...
Still here!
Run Code Online (Sandbox Code Playgroud)

更新:

这不是一个正确的答案,但我最终做了一些事情:

@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
Run Code Online (Sandbox Code Playgroud)

双管语句:

CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
Run Code Online (Sandbox Code Playgroud)

是简写:

CALL :SUBROUTINE_WITH_ERROR 
IF ERRORLEVEL 1 GOTO HANDLE_FAIL    
Run Code Online (Sandbox Code Playgroud)

我仍然很想知道是否有一种方法可以直接从子例程中退出,而不必让 CALLER 处理这种情况,但这至少可以完成工作。


更新 #2:当从另一个子例程中调用子例程时,以上述方式调用,我因此从子例程中调用:

CALL :SUBROUTINE_WITH_ERROR || EXIT /B 1
Run Code Online (Sandbox Code Playgroud)

这样,错误就会传播回“主要”,可以这么说。然后批处理的主要部分可以使用错误处理程序 GOTO :FAILURE 处理错误

Mer*_*ham 23

将此添加到批处理文件的顶部:

@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
)
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地调用:

  • EXIT [errorLevel] 如果你想退出整个文件
  • EXIT /B [errorLevel] 退出当前子程序
  • GOTO :EOF 退出当前子程序

  • 很不错。我做了一个小修改,将 `%~0` 分配给变量而不是 `true`: `if not "%selfwrapped%"=="%~0" ( set selfwrapped=%~0 .... ) `。这样您就可以在相互调用的多个批处理脚本中使用相同的技巧。 (3认同)

JMD*_*JMD 4

这个小调整怎么样?

@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
Run Code Online (Sandbox Code Playgroud)

输出:

Quitting...
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这不会从子例程中退出。相反,它只是检查子例程的结果并从那里采取行动。

  • 谢谢,这肯定会完成工作,如果我找不到更好的答案,那就是我必须做的。但是,我不想在每次调用后都粘贴该行到我又长又复杂的批处理文件中。 (2认同)