Etc.

[VBS] 특정 프로세스명에 대한 모든 PID 별 CPU 성능 쿼리

커널64 2011. 4. 1. 16:52

특정 프로세스명에 대한 모든 PID 별 CPU 성능 쿼리 (로직 개선)
VBS VB Script

strProcess = "notepad"        ' 프로세스 명: .exe 제외

Dim PID(), N1(), D1(), N2(), D2(), CPUPerf()
Set WMI_Service = GetObject("winmgmts:{impersonationlevel=impersonate}!\root\cimv2")
NumCore = GetNumProcessors

Set colItems = WMI_Service.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process where name = '"&strProcess&"' or name like '"&strProcess&"#%'")
ProcessCount = colItems.Count
If ProcessCount = 0 Then
Set colItems = Nothing
Set WMI_Service = Nothing
WScript.Quit
End If

Redim PID(ProcessCount), N1(ProcessCount), D1(ProcessCount), N2(ProcessCount), D2(ProcessCount), CPUPerf(ProcessCount)
i = 0
For Each CPUPerf1 in colItems
PID(i) = CPUPerf1.IDProcess
N1(i) = CPUPerf1.PercentProcessorTime
D1(i) = CPUPerf1.TimeStamp_Sys100NS
i = i + 1
Next
WScript.Sleep(500)
Set colItems = WMI_Service.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process where name = '"&strProcess&"' or name like '"&strProcess&"#%'")
i = 0
For Each CPUPerf2 in colItems
N2(i) = CPUPerf2.PercentProcessorTime
D2(i) = CPUPerf2.TimeStamp_Sys100NS
i = i + 1
Next
Set colItems = Nothing

For i = 0 to ProcessCount
If ( 0 = (D2(i)-D1(i)) ) then
CPUPerf(i) = 0
Else
CPUPerf(i) = Round(((((N2(i) - N1(i)) / (D2(i) - D1(i))) * 100) / NumCore), 2)
End If
Next

' 테스트 출력
WScript.Echo "프로세스 수: " & ProcessCount
For i = 0 to ProcessCount-1
WScript.Echo "PID: "& PID(i) & vbTab & "CPU Util: " & CPUPerf(i) & "%"
Next

' 코어 수 쿼리 함수
Function GetNumProcessors
Set WMI_Service = GetObject("winmgmts:{impersonationlevel=impersonate}!\root\cimv2")
Set colItems = WMI_Service.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objItem In colItems
On Error Resume Next
GetNumProcessors = objItem.NumberOfLogicalProcessors
If Err.number <> 0 Then
GetNumProcessors = objItem.NumberOfProcessors
End If
On Error GoTo 0
Next
End Function