【问题标题】:Get first record from WMI ExecQuery从 WMI ExecQuery 获取第一条记录
【发布时间】:2010-03-04 11:10:36
【问题描述】:

我有一个用于检索 Windows 版本的简单 vbscript:

Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colVersions = objWMI.ExecQuery("Select * from Win32_OperatingSystem")

For Each objVer in colVersions
   ver = objVer.Version
Next

是否可以获取第一条记录,或者我是否必须遍历集合中的所有记录。我见过的所有例子都是For Each 构造。我在尝试时收到 Expected end of statement 错误:

ver = colVersions[0].Version

ExecQuery 的返回值似乎不是正确的集合。

【问题讨论】:

  • 我尝试了很长一段时间以来获取第一个值的各种方法,但都做不到。这绝不是一个答案:)

标签: windows vbscript wmi


【解决方案1】:
For Each objVer in colVersions
   ver = objVer.Version
   exit for
Next

【讨论】:

    【解决方案2】:

    在 Windows Vista 及更高版本上,您可以使用 ItemIndex 方法通过索引获取集合项:

    ver = colVersions.ItemIndex(0).Version
    

    在早期的 Windows 版本中,恐怕无法做到这一点。

    【讨论】:

    • 这正是我想要的。谢谢。
    • @Lukas:确实,MSDN 说ItemIndex 是在 Windows Vista 中引入的。更新了答案。
    【解决方案3】:
    Set objWMI = GetObject("WinMgmts:{ImpersonationLevel=Impersonate}!\\.\Root\CIMV2")
    Set objOS  = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem").ItemIndex(0)
    
    msgBox objOS.Version
    

    编辑解释: 通过将 .ItemIndex(0) 添加到原始查询中,您将获取集合中的第一个项目。这将消除对 For/Each 循环的需要。

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    • 这只是重复海伦的回答(减去版本警告)。
    • 最终结果相同,但 IMO 更干净。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多