我通过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是否支持允许我枚举属性列表的内省级别?或者有什么我可以做的涉及我可以引用和检查脚本的模式?
答案 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()函数需要进一步的工作。