我在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")
该行有效,但它没有绑定到实例,所以我得到的只是空值。
如何将此技术用于单实例类?就像有没有办法指定“默认”实例?
答案 0 :(得分:0)
在Vista及更高版本中,您可以使用ItemIndex()
属性:
strManufacturer = objColItems.ItemIndex(0).Manufacturer
答案 1 :(得分:-1)
Set objWMI = GetObject("winmgmts:\\.root\cimv2").Get("Win32_BIOS=@")
WScript.Echo objWMI.Manufacturer