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

Posted

技术标签:

【中文标题】VBScript:如何检查 SWbemObjectSet 的有效性?【英文标题】:VBScript: how to inspect validity of SWbemObjectSet? 【发布时间】:2010-05-27 09:54:54 【问题描述】:

我有以下 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】:

编辑;

.Count 似乎适用于模式查询;

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

你可以包装-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 包装在一个函数中是一个不错的解决方法。

以上是关于VBScript:如何检查 SWbemObjectSet 的有效性?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过VBscript检查MS Access中是不是存在表

检查文件夹中是不是存在任何文件(VBScript)

检查http连接vbscript

如何在带有命令行参数的 vbscript 中调用函数?

通过 VBScript 检查二进制注册表值是不是存在

vbscript 检查是不是安装了 Matlab 运行时编译器