我有一个
Windows批处理文件,里面有几个子程序,如下所示:
call :a goto :eof :a call :b goto :eof :b :: How do I directly exit here from here? goto :eof
我在Vista的cmd窗口中运行它.
如果我在批处理文件中的某处检测到错误,我希望它以非零错误级别退出.我可以在例程中编写任何内容:b将导致批处理文件像这样终止.
>我试过’退出’,关闭整个cmd窗口.那不是我想要的.
>我试过’退出/ B 1′.这将返回上一个例程.要在每次“调用”之后使用此方案,我必须在每次“调用”之后仔细写入“if errorlevel 1 exit / B 1”以将错误传递回调用堆栈.我不想在每次通话后写这一行.
这篇文章很有意思,但没有其他选择的行为符合我的要求. http://www.computerhope.com/exithlp.htm
还有另一种方式吗?
谢谢.
您可以像这样调用子例程:
原文链接:https://www.f2er.com/windows/364686.htmlcall :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
但考虑到填充堆栈所需的时间,我认为第一个变体会更容易.
我还在考虑使用第二个批处理文件,在没有调用的情况下运行时基本上会停止第一个批处理文件.但不知何故,这对子程序不起作用.展开调用堆栈似乎仍然存在.