运行WMI查询的更好方法是什么?

时间:2014-08-21 20:56:46

标签: vbscript wmi wmi-query

我在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")

该行有效,但它没有绑定到实例,所以我得到的只是空值。

如何将此技术用于单实例类?就像有没有办法指定“默认”实例?

2 个答案:

答案 0 :(得分:0)

在Vista及更高版本中,您可以使用ItemIndex()属性:

strManufacturer = objColItems.ItemIndex(0).Manufacturer

答案 1 :(得分:-1)

Set objWMI = GetObject("winmgmts:\\.root\cimv2").Get("Win32_BIOS=@")
WScript.Echo objWMI.Manufacturer