如何从子程序内部退出批处理文件?
如果我使用 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
退出当前子程序这个小调整怎么样?
@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)
从技术上讲,这不会从子例程中退出。相反,它只是检查子例程的结果并从那里采取行动。
归档时间: |
|
查看次数: |
33747 次 |
最近记录: |