VBScript: как проверить правильность SWbemObjectSet? - PullRequest
4 голосов
/ 27 мая 2010

У меня есть следующий VBScript:

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 иногда отказывается от классов WMI в новых версиях Windows. Я хочу, чтобы мой сценарий справился с этим изящно.

1 Ответ

5 голосов
/ 27 мая 2010

Изменить;

.Count, кажется, работает для запроса схемы;

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

Вы можете запутать ошибку доступа;

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