【问题标题】:Better way to run WMI queries?运行 WMI 查询的更好方法?
【发布时间】: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

标签: vbscript wmi wmi-query


【解决方案1】:

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

strManufacturer = objColItems.ItemIndex(0).Manufacturer

【讨论】:

  • 接近我的要求,但我有点改写了这个问题,以便更具体地说明我想要什么。不过还是谢谢。
【解决方案2】:
Set objWMI = GetObject("winmgmts:\\.root\cimv2").Get("Win32_BIOS=@")
WScript.Echo objWMI.Manufacturer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多