使用 errorlevel 查找错误的问题
Posted
技术标签:
【中文标题】使用 errorlevel 查找错误的问题【英文标题】:Problems with finding errors using errorlevel 【发布时间】:2014-06-26 08:08:54 【问题描述】:我在批处理作业中遇到了一些错误问题。我目前每天运行 50 个批处理作业,并带有一个日志文件,它告诉我批处理作业是否成功完成。 上周我注意到了一些错误,现在,我没有任何控制可以显示或只是告诉我批处理作业是否因错误而失败。 我的批处理作业正在通过 sqlplus 启动 af 脚本。 我尝试过使用错误级别,但 id 不起作用。
到目前为止,我的批处理作业看起来像这样。 我已经包含了我尝试使用的错误级别代码。
@Echo Off
@For /F "tokens=1,2,3,4 delims=-/ " %%A in ('Date /t') do @(
Set Day=%%A
Set Month=%%B
Set Year=%%C
Set All=%%A-%%B-%%C
)
@For /F "tokens=1,2,3 delims=:,. " %%A in ('echo %time%') do @(
Set Hour=%%A
Set Min=%%B
Set Sec=%%C
Set Allm=%%A.%%B.%%C
)
@For /F "tokens=3 delims=: " %%A in ('time /t ') do @(
Set AMPM=%%A
@Echo On
)
echo Start: %date% %time% >> ..\log\Scriptname_%All%_%Allm%.log
sqlplus "Script" >> ..\log\Scriptname_%All%_%Allm%.log
IF %errorlevel% NEQ 0 GOTO :Error
GOTO :Success
:error
echo There was an error.
echo Stop: %date% %time% >> ..\log\Scriptname_%All%_%Allm%.log
EXIT 1
:end
echo Success.
echo Stop: %date% %time% >> ..\log\Scriptname_%All%_%Allm%.log
EXIT 0
【问题讨论】:
【参考方案1】:您的批处理文件看起来不错。问题很可能出在您的 SQL*PLUS 脚本上。
如果 SQL*PLUS 脚本中发生错误,默认情况下 SQL*PLUS 不会返回错误。您可以在 SQL*PLUS 脚本中使用 WHENEVER SQLERROR 和 WHENEVER OSERROR 以在出错时强制终止并使用非零错误代码。
whenever sqlerror exit failure
whenever oserror exit failure
有多种选项可以更好地控制返回的代码,并控制事务行为(提交或回滚)。点击链接了解更多信息。
【讨论】:
【参考方案2】:我认为sqlplus默认不返回错误代码所以总是返回0。
此线程中描述了一些更改此选项的选项:
Sql*plus always returns exit code 0?
另一种方法是捕获输出并对其进行解析以检测错误。
【讨论】:
以上是关于使用 errorlevel 查找错误的问题的主要内容,如果未能解决你的问题,请参考以下文章
bat中errorlevel与%errorlevel%的区别
Powershell 是不是忘记在解析器错误上设置 ERRORLEVEL?
如何处理调用 sqlplus 的批处理文件中的错误,因为 sqlplus 没有在错误或失败时设置 ERRORLEVEL?