SWbemObjectSet没有实例时的错误处理

时间:2016-10-19 19:51:02

标签: vbscript wmi

根据this TechNet article,我可以使用.Count属性来确定WMI查询是否有结果。例如,他们计算安装的磁带机数量:

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\ROOT\cimv2")
Set colItems = objWMIService.ExecQuery( "SELECT * FROM Win32_TapeDrive")
wscript.stdout.writeline "Error: " & Err.Description
wscript.stdout.writeline "Count: " &  colItems.count
wscript.stdout.writeline "Error: " & Err.Description

输出:

'Output (as expected per the TechNet article)
Error:
Count: 0
Error:

我尝试做的是库存监控器。附加显示器时,以下代码效果很好,但是当没有显示器时,它会崩溃:

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\ROOT\WMI")
Set colItems = objWMIService.ExecQuery( "SELECT * FROM WMIMonitorID")
wscript.stdout.writeline "Error: " & Err.Description
wscript.stdout.writeline "Count: " &  colItems.count
wscript.stdout.writeline "Error: " & Err.Description

输出:

'Output (not as expected)
Error: 
temp_script.vbs(5, 1) SWbemObjectSet: Not supported
'The error number is 0x8004100C

使用

Set colItems =  GetObject("winmgmts:\\" & strComputer & "\ROOT\WMI").InstancesOf("WmiMonitorID")

给出了相同的结果,正如您所看到的,在我尝试访问colItems的属性之前,不会抛出任何错误。我可以使用On Error Resume Next解决此问题,但此代码是较大项目的一部分,因此我不应忽略每个错误。

On Error Resume Next
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\ROOT\WMI")
Set colItems = objWMIService.ExecQuery( "SELECT * FROM WMIMonitorID")
wscript.stdout.writeline "Error: " & Err.Description
wscript.stdout.writeline "Count: " &  colItems.count
wscript.stdout.writeline "Error: " & Err.Description

输出:

'Output (as expected)
Error:
Error: Not supported

我正在测试的机器是Windows 2012 R2服务器,没有磁带驱动器,也没有连接的显示器。有没有办法让我测试一个SWbemObjectSet对象" stuff"没有它抛出错误?或者有没有办法我可以处理这个错误,而不会忽略每个错误?我只能找到两个处理此问题的SO帖子(Post 1Post 2)。将.Count置于函数中的函数似乎可行,但有没有其他方法可以处理类的实例?

0 个答案:

没有答案