根据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 1和Post 2)。将.Count
置于函数中的函数似乎可行,但有没有其他方法可以处理类的实例?