【发布时间】:2014-08-21 20:56:46
【问题描述】:
我在 VBScript 中编写大部分脚本,并且经常使用 WMI 查询从系统中获取信息。 WMI ExecQuery 方法总是返回一个我必须从For 循环访问的WMI 集合对象——即使在您只能返回一项的情况下也是如此。这是一个例子:
Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
Set objColItems = objWMI.ExecQuery("SELECT * FROM Win32_BIOS",,48)
For Each objItem In objColItems
strManufacturer = objItem.Manufacturer
Next
...
在这个例子中,我只需要电脑的品牌(即戴尔、惠普等)。 Win32_BIOS 类应该只有一个实例。
然而,更令人讨厌的是,当类有多个实例时(例如,Win32_Printers),我确切地知道我在寻找哪一个。然后我必须插入一个If 来检查名称。当您只是从多个类中查找一条信息时,这是一个令人讨厌的代码量。
我以为我曾经看过一个代码示例,其中有人使用一行代码直接从 WMI 类的实例访问属性,但我当然没有写下来。
那么有没有办法做到这一点,而不必查询它并通过循环运行它?
更新:
好吧,我想我只是没有足够努力地谷歌,但我发现我正在寻找的是 SWbemServices.Get 方法。这使您无需查询即可获取类的特定实例的属性。
在他们在该页面上提供的示例中,我只需两行代码即可获得服务的状态:
Set objWMI = GetObject("winmgmts:\\.\root\cimv2").Get("Win32_Service.Name='Spooler'")
WScript.Echo objWMI.State
整洁。除非它仅适用于类的多个实例并且您知道要使用哪个实例的情况。很好的发现,但是在我上面给出的示例中,我如何使用它,其中只有一个实例?
Set objWMI = GetObject("winmgmts:\\.root\cimv2").Get("Win32_BIOS.Manufacturer")
给我一个错误:Invalid object path.
Set objWMI = GetObject("winmgmts:\\.root\cimv2").Get("Win32_BIOS")
那行有效,但它没有绑定到实例,所以我得到的只是空值。
如何将这种技术用于单实例类?有没有办法指定“默认”实例?
【问题讨论】:
-
x = objColItems(0).Manufacturer。也许wmic更容易,我用那个。在命令提示符中,wmic bios get manufacturer