Продолжаем разговор про PowerShell
Наверное это самая распространенная команда на PowerShell
1 |
Get-Process |
Результатом будет:
1 2 3 4 5 |
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 72 8 1180 52 42 0,02 1548 armsvc 1968 10 2248 2592 64 4,92 1104 atieclxx 118 7 1436 988 33 0,06 816 atiesrxx |
Как мы видим, она показывает список процессов в системе, но вот досада, она не показывает загрузку CPU в % каждого процесса, вместо этого она показывает CPU(s). Что же это такое? Давай те разбираться.
Дело в том, что CPU(s) — это время в сек. которое потратил процессор на выполнения процесса, т.е. в моем случае процесс 7zFM всего потратил 0,45 сек. на все свою работу. Но как это можно превратить в % ? Да очень просто: надо сделать 2 замера, посчитать разницу во времени между замерами и так же посчитать разницу потраченного времени данным процессом. Давай те рассмотрим код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
cls #Узнаем сколько у нас всего ядер $core = Get-WmiObject -Class Win32_ComputerSystem | Select-Object NumberOfLogicalProcessors #Первый замер $data_start = Get-Date $process_start = Get-Process | Where-Object {$_.Name -contains "7zFM"} | Select-Object TotalProcessorTime # "Поспим" немного и "поработаем" в данном процессе start-sleep -Seconds 5 #Второй замер $data_stop = Get-Date $process_stop = Get-Process | where-Object {$_.Name -contains "7zFM"} #Подсчитаем загрузку $Data_delta = $data_stop.Ticks - $data_start.Ticks $CPU_delta = $process_stop.TotalProcessorTime.Ticks - $process_start.TotalProcessorTime.Ticks if ($Data_delta -gt 0 -and $CPU_delta -gt 0){ $CPU_Load = ($CPU_delta * 100) / ($Data_delta * $core.NumberOfLogicalProcessors) }else{ $CPU_Load = 0 } # Выводим результат Write-Host $CPU_Load |
В результате мы получим загрузку в %. При небольшом изменении кода можно получить загрузку по всем процессам.