Поддерживает ли VBScript самоанализ объектов?

Я получаю результаты из WMI, используя WQL через VBScript.

В примерах для перебора результатов используется цикл 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 — мой обычный язык, но в данном случае я не могу установить его на целевые машины; Я могу выполнять удаленные запросы WMI через Python, но я пытаюсь запустить локальное событие, поэтому возвращаюсь к VBScript. Хотя я понимаю, что Powershell может это сделать, я бы предпочел не изучать его прямо сейчас.

Итак, поддерживает ли VBScript тот уровень самоанализа, который позволил бы мне перечислить список свойств? Или есть что-то, что я могу сделать со схемой, на которую я могу ссылаться и исследовать в сценарии?


person MetaHyperBolic    schedule 05.10.2011    source источник


Ответы (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() нуждается в доработке.

person Ekkehard.Horner    schedule 06.10.2011