スクリプトでの WMI データのリフレッシュ

監視スクリプトでは、SWbemRefresher オブジェクトを使用して GetObject の連続した呼び出しを回避できます。 SWbemRefresher オブジェクトは、1 回の呼び出しでデータをリフレッシュできる複数の WMI オブジェクトを保持できるコンテナーです。

Win32_PerfFormattedData_PerfDisk_LogicalDisk や、Win32_Perf から派生したその他のプレインストール されたクラスなどの、WMI パフォーマンス クラスから正確なデータを取得するには、SWbemRefresher オブジェクトを使用する必要があります。

次の手順では、スクリプト内のデータをリフレッシュする方法について説明します。

スクリプト内のデータをリフレッシュするには

  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_PerfRawData_PerfDisk_LogicalDisk ではなく Win32_PerfFormattedData_PerfDisk_LogicalDisk など、Win32_PerfFormattedData から派生した事前計算されたデータ クラスを使用します。 そうしない場合は、単純カウンター以外のすべてのプロパティの値を計算する必要があります。

    Set objRefreshableItem = _
        objRefresher.AddEnum(objServicesCimv2 , _
        "Win32_PerfFormattedData_PerfProc_Process")
    
  4. 最初のパフォーマンス データを取得するには、データを 1 回リフレッシュします。

    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 呼び出しは、プロセッサ時間の 1% を超えて使用するプロセスの PercentProcessorTime プロパティの変更を示すために 3 回行われます。

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 タスク: パフォーマンスの監視

パフォーマンス データの監視