2010-05-27 122 views
4

我有下面的VBScript:VBScript:如何檢查SWbemObjectSet的有效性?

SET Wmi = GetObject("winmgmts:\\.\root\cimv2") 
SET QR = Wmi.ExecQuery("SELECT * FROM Win32_Processor") 
MsgBox("" & QR.Count) 

這工作完全正常。然而,當我查詢的東西不存在:

SET Wmi = GetObject("winmgmts:\\.\root\cimv2") 
SET QR = Wmi.ExecQuery("SELECT * FROM Win32_DoesNotExist") 
MsgBox("" & QR.Count) 

我收到以下錯誤信息:

Script: E:\test.vbs 
Line: 3 
Char: 1 
Error: Invalid class 
Code: 80041010 
Source: SWbemObjectSet 

我怎樣才能知道QR對象是否有效?

如果我打電話TypeName(QR),它會說SWbemObjectSet,但只要我嘗試查詢其屬性之一,它會失敗並顯示上述消息。

我對這個錯誤進行了搜索,大多數網頁似乎都說了一些「只是不要做那個查詢」的效果。不幸的是,這不是一種選擇,因爲我想在多個版本的Windows上運行相同的腳本,並且Microsoft偶爾會在新版本的Windows中棄用WMI類。我希望我的腳本能夠優雅地處理它。

回答

5

編輯;

.Count似乎適用於模式查詢;

dim testNs: testNs = "Win32_DoesNotExist" 
dim colClasses: set colClasses = Wmi.ExecQuery("Select * From Meta_Class where __Class = """ & testNs & """") 
msgbox colClasses.count 

你可以包裝n陷阱的訪問錯誤;

SET QR = Wmi.ExecQuery("SELECT * FROM Win32_DoesNotExist") 

dim i: i = getCount(QR) 

if (i < 0) then 
    msgbox "oopsy" 
else 
    msgbox "count is " & i 
end if 

function getCount(wmiCol) 
    on error resume next 
    getCount = QR.Count 
    if (err.number <> 0) then getCount = (-1) 
    on error goto 0 
end function 
+0

是的,有點潰敗,但它有伎倆。謝謝! – jqno 2010-05-27 13:51:26

+0

在某些情況下,'.Count'屬性仍然會拋出基本不可捕獲的錯誤(例如,在沒有連接監視器時查詢WMIMonitorID)。在函數中包裝'.Count'是一個不錯的工作。 – Tim 2016-10-19 19:02:50