.bat文件中的错误处理

时间:2017-03-15 11:17:12

标签: batch-file error-handling sqlplus

我有一个.bat文件,它运行两个SQL文件并移动文件。我需要在此.bat文件中进行一些错误处理。我希望它在sql中生成错误并将其传递给AutoSys 我得到了这段代码:

#!/bin/sh 
. $HOME/.bash_profile

sqlplus -s $AUTOSYS_DB_USER/$AUTOSYS_DB_PASSWD <<!
WHENEVER OSERROR EXIT 999;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
alter session set nls_date_format='DD/MM/YYYY';
execute P_LOST_APPROVALS;
!

exit_code=$?
if [ $exit_code != 0 ]; then
echo "Error calling sqlplus, return code = " $exit_code
exit $exit_code
fi

exit 0

但是,我需要它运行在.bat文件而不是Linux?

我目前有:

echo exit | sqlplus -s %CONNECT% @Code.sql 
IF %ERRORLEVEL% NEQ 0 (
echo Unsuccessful
goto @ERROR_HANDLING_SQL
)

完整的.bat文件:

@echo off
call config.bat
SET CONNECT=%var1%/%var2%@avpr.world

Pushd  Location


Set SCRIPTPATH=Location
Set RESULTPATH=Location


echo exit | sqlplus -s %CONNECT% @Code.sql
IF %ERRORLEVEL% NEQ 0 (
echo Unsuccessful
goto @ERROR_HANDLING_SQL
)


echo exit | sqlplus -s %CONNECT% @createTXT.sql > File%date:~0,2%%date:~3,2%%date:~6,4%.txt
IF %ERRORLEVEL% NEQ 0 (
echo Unsuccessful
goto @ERROR_HANDLING_SQL
 )



move "File%date:~0,2%%date:~3,2%%date:~6,4%.txt" %RESULTPATH%


echo exit | sqlplus -s %CONNECT% @dropTable.sql
IF %ERRORLEVEL% NEQ 0 (
echo Unsuccessful
goto @ERROR_HANDLING_SQL
)



 : ERROR_HANDLING_SQL
 <echo -1>

pause
Exit

1 个答案:

答案 0 :(得分:0)

批处理中退出代码$?的等效项是通过变量%ERRORLEVEL%可访问的errorlevel。在批处理脚本中,存在一种使用errorlevel的IF子句的特殊形式:IF ERRORLEVEL n等效于:“如果errorlevel 大于或等于n ”< / em>的。与在bash中一样,值为0表示上一个命令执行时没有错误(并非总是如此,某些命令不设置errorlevel)。所以你有两个选择:

  1. IF %ERRORLEVEL% NEQ 0这是您的bash脚本中if语句的字面翻译。请注意,您必须使用IF !ERRORLEVEL! NEQ 0分隔的代码块内的delayed expansion版本(...)(请查看解释原因的this question
  2. IF ERRORLEVEL 1这是恕我直言更合适(虽然取决于你的喜好)。也适用于(...)代码块,但假设命令永远不会设置负错误级别(从未遇到过,但值得一提)
  3. 通常使用set命令设置变量不会更改错误级别,因此您可以选择两个选项中的任何一个。但由于我现在没有Windows机器来测试它,我会安全地玩它并给你第一个选择。一旦我测试了第二个选项,我就会编辑我的答案。

    set exit_code=%ERRORLEVEL%
    if %exit_code% NEQ 0 (  
        echo Error calling sqlplus, return code = %exit_code%
        exit /b %exit_code%
    )
    

    最后一些建议:使用exit /b  而不是exitexit也将以批处理

    退出命令行

    编辑我已经测试了第二个版本,它也能正常运行。所以上面的代码可以替换为:

    set exit_code=%ERRORLEVEL%
    IF ERRORLEVEL 1 (  
        echo Error calling sqlplus, return code = %exit_code%
        exit /b %exit_code%
    )
    

    This blog article很好地解释了为什么应该使用%ERRORLEVEL%变量来使用此版本而不是第一个版本。

    另一个选项@aschipflhis comment中提醒我使用了conditional executions operators && and ||

      仅当command1 && command2成功时,
    • command2才会执行command1 仅当command1 || command2失败时,
    • command2才会执行command1

    两个运营商都使用退出代码(在大多数情况下与errorlevel相同但不总是如此)来确定命令是否失败或成功。

    我也看到你发布了批处理文件。我想指出一些事情:goto @ERROR_HANDLING_SQL会抛出错误,因为没有标签@ERROR_HANDLING_SQL。但是,在脚本的末尾存在标签ERROR_HANDLING_SQL。如果您尝试跳转到该标签,则应将goto @ERROR_HANDLING_SQL的所有出现替换为goto ERROR_HANDLING_SQL