VBScript:如何检查 SWbemObjectSet 的有效性?

4

我有以下VBScript代码:

SET Wmi = GetObject("winmgmts:\\.\root\cimv2")
SET QR = Wmi.ExecQuery("SELECT * FROM Win32_Processor")
MsgBox("" & QR.Count)

这很好地运作。然而,当我查询不存在的内容时:

SET Wmi = GetObject("winmgmts:\\.\root\cimv2")
SET QR = Wmi.ExecQuery("SELECT * FROM Win32_DoesNotExist")
MsgBox("" & QR.Count)

我收到了以下错误信息:
Script: E:\test.vbs
Line: 3
Char: 1
Error: Invalid class
Code: 80041010
Source: SWbemObjectSet

我该如何确定QR对象是否有效?
如果我调用TypeName(QR),它会显示SWbemObjectSet,但一旦我尝试查询其属性,就会出现上述错误。
我已经搜索了这个错误,大多数页面似乎都说类似于“不要进行那个查询”。不幸的是,这不是一个选项,因为我想在多个Windows版本上运行相同的脚本,并且微软偶尔会在新版本的Windows中弃用WMI类。我希望我的脚本能够优雅地处理这个问题。
1个回答

5

编辑:

.Count 在模式查询中似乎有效;

dim testNs: testNs = "Win32_DoesNotExist"
dim colClasses: set colClasses = Wmi.ExecQuery("Select * From Meta_Class where __Class = """ & testNs  & """")
msgbox colClasses.count

您可以使用wrap-n-trap来捕获访问错误;

SET QR = Wmi.ExecQuery("SELECT * FROM Win32_DoesNotExist")

dim i: i = getCount(QR)

if (i < 0) then
    msgbox "oopsy"
else
    msgbox "count is " & i
end if

function getCount(wmiCol)
    on error resume next
    getCount = QR.Count
    if (err.number <> 0) then getCount = (-1)
    on error goto 0
end function

“.Count”属性在某些情况下仍可能会抛出基本上无法捕获的错误(例如,在没有连接监视器时查询WMIMonitorID)。将“.Count”包装在函数中是一个不错的解决方法。 - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接