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

时间:2010-05-27 09:54:54

标签: vbscript wmi

我有以下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,但只要我尝试查询其中一个属性,它就会失败并显示上述消息。

我已经用Google搜索了这个错误,并且大多数网页似乎都说“只是不做那个查询”。遗憾的是,这不是一个选项,因为我想在多个版本的Windows上运行相同的脚本,而Microsoft偶尔会在新版本的Windows中弃用WMI类。我希望我的脚本能够优雅地处理它。

1 个答案:

答案 0 :(得分:5)

编辑;

.Count似乎适用于架构查询;

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

您可以包裹 - 捕获访问错误;

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