Обновление данных WMI в скриптах
В скриптах мониторинга можно избежать последовательных вызовов GetObject с помощью объекта SWbemRefresher . Объект SWbemRefresher — это контейнер, который может содержать несколько объектов WMI, данные которых можно обновить в одном вызове.
Использование объекта SWbemRefresher требуется для получения точных данных из классов производительности WMI, таких как Win32_PerfFormattedData_PerfDisk_LogicalDisk или других предустановленных классов, производных от Win32_Perf.
В следующей процедуре описывается обновление данных в скриптах.
Обновление данных в скриптах
Вызовите CreateObject , чтобы создать объект средства обновления SWbemRefresher .
Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Подключитесь к пространству имен WMI. Чтобы использовать предварительно установленные классы производительности Win32_Perf , подключитесь к root\cimv2.
Set objServicesCimv2 = GetObject("winmgmts:\\" _ & strComputer & "\root\cimv2")
Добавьте в средство обновления один объект ( вызовите SWbemRefresher.Add) или коллекцию (вызов SWbemRefresher.AddEnum).
Используйте предварительно вычисляемые классы данных, производные от Win32_PerfFormattedData, например , Win32_PerfFormattedData_PerfDisk_LogicalDisk вместо Win32_PerfRawData_PerfDisk_LogicalDisk. В противном случае необходимо вычислить значения для всех свойств, отличных от простых счетчиков.
Set objRefreshableItem = _ objRefresher.AddEnum(objServicesCimv2 , _ "Win32_PerfFormattedData_PerfProc_Process")
Обновите данные один раз, чтобы получить исходные данные о производительности.
Вызовите метод SWbemRefresher.Refresh или универсальный метод SWbemObjectEx.Refresh_ .
objRefresher.Refresh
Если вы отслеживаете производительность и имеете коллекцию в объекте refresher, циклически просматривайте объекты коллекции.
For Each Process in objRefreshableItem.ObjectSet If Process.PercentProcessorTime > 1 then WScript.Echo Process.Name & vbnewLine _ & Process.PercentProcessorTime & "%" End If Next
Очистите элементы из средства обновления, вызвав SWbemRefresher.DeleteAll или удалите определенные элементы, вызвав SwbemRefresher.Remove.
В следующем примере кода VBScript показано, как обновить один объект на локальном компьютере. Скрипт создает контейнер средства обновления и добавляет экземпляр перечислителя для Win32_PerfFormattedData_PerfProc_Process экземпляров. Вызов Refresh выполняется три раза, чтобы продемонстрировать изменения в свойстве PercentProcessorTime для процессов, использующих более одного процента времени процессора.
On Error Resume Next
strComputer = "."
Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Set objServicesCimv2 = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
If Err = 0 Then
Set objRefreshableItem = _
objRefresher.AddEnum(objServicesCimv2 ,"Win32_PerfFormattedData_PerfProc_Process")
objRefresher.Refresh
' Loop through the processes three times to locate
' and display all the process currently using
' more than 1 % of the process time. Refresh on each pass.
For i = 1 to 3
Wscript.Echo "Refresh number " & i
objRefresher.Refresh
For Each Process in objRefreshableItem.ObjectSet
If Process.PercentProcessorTime > 1 then
WScript.Echo Process.Name & vbnewLine & Process.PercentProcessorTime & "%"
End If
Next
Next
Else
WScript.Echo Err.Description
End If
Свойство Index возвращаемого объекта SWbemRefreshableItem представляет индекс объекта в коллекции средства обновления. Можно вызвать свойство SWbemRefreshableItem.IsSet , чтобы определить, является ли элемент в средства обновления одним элементом или коллекцией. Чтобы получить доступ к одному элементу, используйте свойство SWbemRefreshableItem.Object . Если вы не вызываете SWbemRefreshableItem.Object, скрипт завершается ошибкой при попытке доступа к объекту. Чтобы получить доступ к коллекции, используйте свойство SWbemRefreshableItem.ObjectSet .
Связанные темы