我有一个Windows批处理文件,里面有几个子例程:
call :a
goto :eof
:a
call :b
goto :eof
:b
:: How do I directly exit here from here?
goto :eof
我在Vista的cmd窗口中运行它 如果我在批处理文件中的某处检测到错误,我希望它以非零错误级别退出。我可以在例程中编写任何内容:b将导致批处理文件像这样终止。
这篇文章很有意思,但没有替代方案的行为符合我的要求。 http://www.computerhope.com/exithlp.htm
还有其他办法吗?
感谢。
答案 0 :(得分:16)
您可以像这样调用子程序:
call :b||exit /b 1
相当于
call :b
if errorlevel 1 exit /b 1
它略短,为您节省了一条线,但它仍然不理想,我同意。
除此之外我没有办法。
编辑:好的,我有办法,但它是Pure Evil™。
错误使用最大堆栈大小,因此减少了递归限制,我们创建了另一个子程序,它通过递归调用自身来简化堆栈:
@echo off
echo Calling a
call :a
echo Called a
goto :eof
:a
echo Calling b
call :b
echo Called b
goto :eof
:b
echo Trying to exit
call :exit
goto :eof
:exit
call :exit
然而,这将导致令人讨厌的错误消息
****** B A T C H R E C U R S I O N exceeds STACK limits ****** Recursion Count=704, Stack Usage=90 percent ****** B A T C H PROCESSING IS A B O R T E D ******
此外,我的机器需要大约2秒钟。
您可以通过更改call
语句来抑制错误消息,如下所示:
call :exit >nul 2>&1
会将想要输出的所有内容重定向到一个很大的空白区域。
但考虑到填充堆栈所需的时间,我认为第一个变体会更容易。
我还在考虑使用第二个批处理文件,当没有call
运行时,它将基本上停止第一个批处理文件。但不知何故,这对子程序不起作用。展开调用堆栈似乎仍然存在。
答案 1 :(得分:0)
您可以创建一个exit.bat文件,该文件按标题名称杀死顶部bat文件。
示例:
<强> A.bat 强>
@echo off
title A.bat
echo A.bat
call B.bat
echo A.bat
<强> B.bat 强>
@echo off
echo B.bat
exit.bat A.bat
echo B.bat
<强> Exit.bat 强>
@echo off
echo exit.bat
kill %1