开发者

Does VBScript Support Introspection for Objects?

开发者 https://www.devze.com 2023-04-11 15:05 出处:网络
I am pulling results back from WMI using WQL via VBScript. In examples, a For Each loop is used to iterate over the results, but in each example, it is assumed that the property names are known.Case

I am pulling results back from WMI using WQL via VBScript.

In examples, a For Each loop is used to iterate over the results, but in each example, it is assumed that the property names are known. Case in point:

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

Some of the WMI classes have a very long list of properties associated with them. As an additional complication, some properties cannot be expected to be present (according to various webpages I have read about WMI). Rather than researching each WMI class and hoping that the properties listed are present, I would like to obtain a list of the properties (or columns, if I am thinking in SQL/WQL) present for, say, an objPrinter or any other returned item.

Python is my usual language but I cannot install it on the target machines in this instance; I can perform remote querying of WMI via Python but I am trying to trigger on an local event, hence falling back to VBScript. Although I gather Powershell might be able to do this, I would rather not learn it just this instant.

So, does VBScript support that level of introspection which would allow me to enumerate a list of properties? Or is there something 开发者_JAVA技巧I can do involving a schema I can reference and examine in-script?


Use the .Properties_ collection of the item:

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

Output:

...
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 !!
...

Obviously, the ToString() function needs further work.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号