Creat0Rда не, вроде работает если PID передавать не строкой, а числом
Цитата:
я пытаюсь написать утилитку менеджер процессов
|
в таком случае эффективней выполнять запрос не по отдельным процессам, а сразу по всему списку, вот вариант ProcessList, который кроме PID и Name выводит дополнительно инфу по загрузке CPU:
Код:

$a = _ProcessList ('')
If IsArray ($a) Then
For $i=0 To $a[0][0]
ConsoleWrite (StringFormat('%4i', $a[$i][0]) & ' : ' & StringFormat('%02i', $a[$i][2]) & ' : ' & $a[$i][1] & @CRLF)
Next
EndIf
Func _ProcessList ($name = '', $ticks = 1000)
Local $arrWork[1][3] = [[0,0,0]], $arrMain[1][3] = [[0,'_Summary',0]]
Local $i, $colItems, $objItem, $objWMIService = ObjGet("winmgmts:\\.\root\CIMV2"), $where = 'WHERE IDProcess>0'
If $name <> '' Then $where &= ' AND Name=' & '"' & $name & '"'
; Считываем необходимые характеристики процессов - попытка №1
$colItems = $objWMIService.ExecQuery ("SELECT IDProcess,PercentProcessorTime,Timestamp_Sys100NS FROM Win32_PerfRawData_PerfProc_Process " & $where, "WQL", 0x30)
For $objItem In $colItems
$arrWork[0][0]+=1
ReDim $arrWork[$arrWork[0][0]+1][3]
$arrWork[$arrWork[0][0]][0]=$objItem.IDProcess
$arrWork[$arrWork[0][0]][1]=$objItem.PercentProcessorTime
$arrWork[$arrWork[0][0]][2]=$objItem.Timestamp_Sys100NS
Next
If $arrWork[0][0]=0 Then Return ''
; Накапливаем статистику...
Sleep ($ticks)
; Считываем необходимые характеристики процессов - попытка №2
$colItems = $objWMIService.ExecQuery ("SELECT IDProcess,PercentProcessorTime,Timestamp_Sys100NS FROM Win32_PerfRawData_PerfProc_Process " & $where, "WQL", 0x30)
For $objItem In $colItems
For $i=1 To $arrWork[0][0]
If $arrWork[$i][0]=$objItem.IDProcess Then
$arrMain[0][0]+=1
ReDim $arrMain[$arrMain[0][0]+1][3]
$arrMain[$arrMain[0][0]][0]=$objItem.IDProcess
$arrMain[$arrMain[0][0]][1]=$objItem.Name
$arrMain[$arrMain[0][0]][2]=Round(100*($arrWork[$i][1]-$objItem.PercentProcessorTime)/($arrWork[$i][2]-$objItem.Timestamp_Sys100NS))
$arrMain[0][2]+=$arrMain[$arrMain[0][0]][2]
EndIf
Next
Next
If $arrMain[0][2]>100 Then $arrMain[0][2]=100
Return $arrMain
EndFunc