2011-10-05 62 views
1

我正在使用WQL通過VBScript從WMI中取回結果。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是我通常的語言,但我不能將它安裝在目標機器上;我可以通過Python執行遠程查詢WMI,但我試圖觸發本地事件,因此會回到VBScript。雖然我收集了Powershell可能會做到這一點,但我寧願不在此刻學習它。

那麼,VBScript是否支持這種內省水平,這將允許我枚舉屬性列表?還是有什麼我可以做的,涉及一個我可以參考和檢查腳本的模式?

回答

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()函數需要進一步的工作。

+0

謝謝,這是完美的!道具的功能代碼。 – MetaHyperBolic