【问题标题】:Does VBScript Support Introspection for Objects?VBScript 是否支持对象的自省?
【发布时间】:2011-10-05 21:50:39
【问题描述】:

我正在通过 VBScript 使用 WQL 从 WMI 中提取结果。

在示例中,For Each 循环用于迭代结果,但在每个示例中,都假定属性名称是已知的。举个例子:

Set colInstalledPrinters = objWMIService.ExecQuery ("Select * from Win32_Printer Where Default = True")
For Each objPrinter in colInstalledPrinters
    Wscript.Echo objPrinter.Name
Next

一些 WMI 类有很长的属性列表。作为一个额外的复杂因素,不能期望某些属性存在(根据我读过的有关 WMI 的各种网页)。与其研究每个 WMI 类并希望列出的属性都存在,我想获得一个属性列表(或列,如果我在 SQL/WQL 中考虑),例如 objPrinter 或任何其他返回的项目.

Python 是我常用的语言,但在这种情况下我无法将它安装在目标机器上;我可以通过 Python 执行 WMI 的远程查询,但我试图触发本地事件,因此回退到 VBScript。虽然我认为 Powershell 可能能够做到这一点,但我宁愿不立即学习它。

那么,VBScript 是否支持那种允许我枚举属性列表的自省级别?或者我可以做些什么涉及我可以在脚本中引用和检查的模式?

【问题讨论】:

    标签: vbscript introspection


    【解决方案1】:

    使用项目的 .Properties_ 集合:

    Option Explicit
    
    Const wbemFlagReturnImmediately = &h10
    Const wbemFlagForwardOnly = &h20
    
    Dim objWMIService
    Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
    Dim colItems
    Set colItems = objWMIService.ExecQuery( _
         "SELECT * FROM Win32_Printer" _
       , "WQL" _
       , wbemFlagReturnImmediately + wbemFlagForwardOnly _
    )
    Dim objItem
    For Each objItem In colItems
        Dim oProp
        For Each oProp In objItem.Properties_
            WScript.Echo oProp.Name, TypeName( oProp.Value ), ToString( oProp.Value )
        Next
        WScript.Echo
    Next
    
    Function ToString( vX )
      ToString = "!! work to do !!"
     On Error Resume Next
      ToString = CStr( vX )
     On Error GoTo 0
    End Function
    

    输出:

    ...
    MimeTypesSupported Null !! work to do !!
    Name String Auto HP LaserJet 5 on WINXP2
    NaturalLanguagesSupported Null !! work to do !!
    Network Boolean False
    PaperSizesSupported Variant() !! work to do !!
    ...
    

    显然,ToString() 函数需要进一步工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 2012-11-10
      • 2015-09-26
      • 2013-07-09
      • 1970-01-01
      相关资源
      最近更新 更多