捕获VBS objshell.Run错误

时间:2016-03-19 11:08:07

标签: vbscript sqlcmd

我有以下位的VBS,通过SQLCMD调用并运行* .sql查询。

如何改进错误检查?如果我删除* .sql文件,它认为它已经成功完成,即使它已经没有。

Writelog "Attempting to run *.sql"
err = objshell.Run ("cmd /c sqlcmd -U sa -P Password -i c:\temp\abc.sql",1,FALSE)
If err <> 0 Then
    WriteLog "Error running SQL = " & err & "(" & err.description & ")"
Else
    WriteLog "Successfully run SQL"
End If

1 个答案:

答案 0 :(得分:2)

正如@Noodles在您的问题的评论中指出的那样,您需要将Run方法(bWaitOnReturn)的第三个参数设置为True,以便您的VBScript等待外部命令完成。

但是,仅靠这一点还不够。您还需要使用附加参数-b运行sqlcmd,以便在出现错误时返回非零退出代码:

  

<强> -b

     

指定sqlcmd退出并在发生错误时返回DOS ERRORLEVEL值。返回给DOS ERRORLEVEL变量的值是    1 当SQL Server错误消息的严重性级别大于10时;否则,返回的值为 0 。如果除了-V之外还设置了-b选项,则sqlcmd如果严重性级别低于使用-V设置的值,则不会报告错误。命令提示符批处理文件可以测试ERRORLEVEL的值并适当地处理错误。 sqlcmd不报告严重性级别10(信息性消息)的错误。

     

如果sqlcmd脚本包含错误的注释,语法错误或缺少脚本变量,则返回的ERRORLEVEL为1.

并且您不需要cmd /c,因为您的外部命令不使用任何CMD内置功能(如内部命令,管道或重定向)。

此外,请勿使用err作为变量名称。 VBScript具有内部全局对象Err,用于提供运行时错误信息,在发生运行时错误时会自动填充该信息。尝试为其赋值应该会引发错误。

将您的代码更改为以下内容:

rc = objshell.Run("sqlcmd -b -U sa -P Password -i c:\temp\abc.sql", 1, True)
If rc <> 0 Then
    WriteLog "Error running SQL = " & rc
Else
    WriteLog "Successfully run SQL"
End If