Vbscript 捕获VBS objshell.Run错误

Vbscript 捕获VBS objshell.Run错误,vbscript,sqlcmd,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 = " &

下面是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
Writelog“正在尝试运行*.sql”
err=objshell.Run(“cmd/c sqlcmd-U sa-P Password-ic:\temp\abc.sql”,1,FALSE)
如果错误为0,则
WriteLog“运行SQL时出错=“&err&”(“&err.description&”)
其他的
WriteLog“成功运行SQL”
如果结束

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

然而,仅此一点还不够。您还需要使用附加参数
-b
运行,以使其在出现错误时返回非零退出代码:

-b

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

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

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

另外,不要将
err
用作变量名。VBScript有一个内在的全局对象,用于提供运行时错误信息,在发生运行时错误时自动填充该信息。试图给它赋值本身会引发错误

将代码更改为以下内容:

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
rc=objshell.Run(“sqlcmd-b-U sa-P Password-ic:\temp\abc.sql”,1,True)
如果为0,则
WriteLog“运行SQL=“&rc”时出错
其他的
WriteLog“成功运行SQL”
如果结束

阅读帮助bWaitOnReturn可选。布尔值,指示脚本在继续执行脚本中的下一条语句之前是否应等待程序完成执行。如果设置为true,脚本执行将停止,直到程序完成,Run将返回程序返回的任何错误代码。如果设置为false(默认值),Run方法在启动程序后立即返回,自动返回0(不被解释为错误代码)。完美-非常感谢