VBScript是否支持对象的内省?

时间:2011-10-05 21:50:39

标签: vbscript introspection

我通过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类并希望列出的属性存在,而是希望获得一个列表,例如objPrinter或任何其他返回项目的属性(或列,如果我在思考SQL / WQL)

Python是我的惯用语言,但在此实例中我无法将其安装在目标计算机上;我可以通过Python执行WMI的远程查询,但我试图触发本地事件,因此回退到VBScript。虽然我收集Powershell可能会做到这一点,但我宁愿暂时不去学习它。

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

1 个答案:

答案 0 :(得分:3)

使用项目的.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()函数需要进一步的工作。