在脚本中刷新 WMI 数据

在监视脚本中,可以使用 SWbemRefresher 对象避免连续调用 GetObject。 SWbemRefresher 对象是一个容器,可以保存多个 WMI 对象,WMI 对象的数据可以在一次调用中获得刷新。

需要使用 SWbemRefresher 对象才能从 WMI 性能类(例如 Win32_PerfFormattedData_PerfDisk_LogicalDisk 或派生自 Win32_Perf 的其他预安装类)中获取准确数据。

以下过程介绍如何刷新脚本中的数据。

刷新脚本中的数据

  1. 调用 CreateObject 以创建 SWbemRefresher 刷新程序对象。

    Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
    
  2. 连接到 WMI 命名空间。 若要使用预安装的 Win32_Perf 性能类,请连接到 root\cimv2。

    Set objServicesCimv2 = GetObject("winmgmts:\\" _
        & strComputer & "\root\cimv2")
    
  3. 向刷新程序添加单个对象(调用 SWbemRefresher.Add)或集合(调用 SWbemRefresher.AddEnum)。

    使用从 Win32_PerfFormattedData 派生的预先计算的数据类,例如,使用 Win32_PerfFormattedData_PerfDisk_LogicalDisk 而非 Win32_PerfRawData_PerfDisk_LogicalDisk。 否则,必须计算除简单计数器以外的所有属性的值。

    Set objRefreshableItem = _
        objRefresher.AddEnum(objServicesCimv2 , _
        "Win32_PerfFormattedData_PerfProc_Process")
    
  4. 刷新数据一次以获取初始性能数据。

    调用 SWbemRefresher.Refresh 方法或泛型 SWbemObjectEx.Refresh_ 方法。

    objRefresher.Refresh
    
  5. 如果你要监视性能,而你在刷新程序对象中有一个集合,请循环访问集合对象。

    For Each Process in objRefreshableItem.ObjectSet
        If Process.PercentProcessorTime > 1 then
            WScript.Echo Process.Name & vbnewLine _
                & Process.PercentProcessorTime & "%"
        End If
    Next
    
  6. 通过调用 SWbemRefresher.DeleteAll 清除刷新程序中的项,或通过调用 SwbemRefresher.Remove 删除特定项。

以下 VBScript 代码示例演示如何刷新本地计算机上的单个对象。 该脚本创建刷新程序容器,并为 Win32_PerfFormattedData_PerfProc_Process 实例添加枚举器的实例。 Refresh 调用进行了 3 次,以演示那些使用超过百分之一的处理器时间的进程的 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

返回的 SWbemRefreshableItemIndex 属性表示刷新程序集合中对象的索引。 可以调用 SWbemRefreshableItem.IsSet 属性来确定刷新程序中的项是单个项还是集合。 若要访问单个项,请使用 SWbemRefreshableItem.Object 属性。 如果你不调用 SWbemRefreshableItem.Object,则脚本会在你尝试访问对象时失败。 若要访问集合,请使用 SWbemRefreshableItem.ObjectSet 属性。

性能计数器类

在脚本中访问性能数据

WMI 任务:性能监视

监视性能数据