스크립트에서 WMI 데이터 새로 고침
모니터링 스크립트에서는 SWbemRefresher 개체를 사용하여 GetObject에 대한 연속 호출을 방지할 수 있습니다. SWbemRefresher 개체는 한 번의 호출로 데이터를 새로 고칠 수 있는 여러 WMI 개체를 저장할 수 있는 컨테이너입니다.
Win32_PerfFormattedData_PerfDisk_LogicalDisk 또는 Win32_Perf에서 파생된 다른 사전 설치된 클래스와 같은 WMI 성능 클래스에서 정확한 데이터를 얻으려면 SWbemRefresher 개체를 사용해야 합니다.
다음 절차에서는 스크립트에서 데이터를 새로 고치는 방법을 설명합니다.
스크립트에서 데이터를 새로 고치는 방법은 다음과 같습니다.
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_PerfRawData_PerfDisk_LogicalDisk 대신 Win32_PerfFormattedData_PerfDisk_LogicalDisk). 그러지 않으면 단순 카운터 이외의 모든 속성에 대한 값을 계산해야 합니다.
Set objRefreshableItem = _ objRefresher.AddEnum(objServicesCimv2 , _ "Win32_PerfFormattedData_PerfProc_Process")
데이터를 한 번 새로 고쳐서 초기 성능 데이터를 가져옵니다.
SWbemRefresher.Refresh 메서드 또는 제네릭 SWbemObjectEx.Refresh_ 메서드를 호출합니다.
objRefresher.Refresh
성능을 모니터링하고 리프레셔 개체에 컬렉션이 있는 경우 컬렉션 개체를 반복합니다.
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 호출은 프로세서 시간의 1% 이상을 사용하는 프로세스에 대한 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
반환된 SWbemRefreshableItem의 Index 속성은 리프레셔 컬렉션에 있는 개체의 인덱스를 나타냅니다. SWbemRefreshableItem.IsSet 속성을 호출하여 리프레셔의 항목이 단일 항목인지 컬렉션인지 여부를 확인할 수 있습니다. 단일 항목에 액세스하려면 SWbemRefreshableItem.Object 속성을 사용합니다. SWbemRefreshableItem.Object를 호출하지 않으면 개체에 액세스하려고 할 때 스크립트가 실패합니다. 컬렉션에 액세스하려면 SWbemRefreshableItem.ObjectSet 속성을 사용합니다.
관련 항목