![windows powershell отображает процент процессора и использование памяти](https://rvso.com/image/1558677/windows%20powershell%20%D0%BE%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B0%D0%B5%D1%82%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D0%BD%D1%82%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80%D0%B0%20%D0%B8%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8.png)
Я могу использовать ответПроцент ЦП.
While(1) { $p = get-counter '\Process(*)\% Processor Time'; cls;
$p.CounterSamples | sort -des CookedValue | select -f 15 | ft -a}
Теперь у меня проблемы с отображением использования памяти и процента ЦП одновременно для задачи на компьютере. Я знаю, что получу Get-Counter "\Process(*)\Working Set - Private"
память, но мне бы хотелось, чтобы задача, % ЦП и использование памяти отображались одновременно.
ОБНОВЛЕНИЕ 1:В идеале я хотел бы иметь возможность запустить это в powershell как набор команд. Я хотел бы, чтобы вывод отображался как:
Process Name CPU (%) Memory (MB) ------------ ------- -----------
Я воспользуюсь тем, что смогу получить, когда дело дойдет до отображения, с которым можно будет справиться после того, как смогу просто отобразить три элемента в PowerShell.
ОБНОВЛЕНИЕ 2:Этот раздел кода обеспечивает то, что мне нужно
while (1) {cls; Get-WmiObject Win32_PerfFormattedData_PerfProc_Process |
select-object -property Name, PercentProcessorTime, IDProcess, @{"Name" = "WSP(MB)"; Expression = {[int]($_.WorkingSetPrivate/1mb)}} |
? {$_.Name -notmatch "^(idle|_total|system)$"} |
Sort-Object -Property PercentProcessorTime -Descending|
ft -AutoSize |
Select-Object -First 15; start-sleep 5}
В результате получается следующий результат:
Name PercentProcessorTime IDProcess WSP(MB)
---- -------------------- --------- -------
MicrosoftEdgeCP#3 6 18972 6 WmiPrvSE#3 6 27300 7
svchost#22 0 7316 1
Единственный недостаток этого в том, что он зависает после одного показа информации, и я не знаю почему. Есть ли помощь в этом?
ОБНОВЛЕНИЕ:3
$cores = (Get-WmiObject Win32_Processor).NumberOfLogicalProcessors
while ($true) {
$tmp = Get-WmiObject Win32_PerfFormattedData_PerfProc_Process |
select-object -property Name, @{Name = "CPU"; Expression = {($_.PercentProcessorTime/$cores)}}, @{Name = "PID"; Expression = {$_.IDProcess}}, @{"Name" = "Memory(MB)"; Expression = {[int]($_.WorkingSetPrivate/1mb)}} |
Where-Object {$_.Name -notmatch "^(idle|_total|system)$"} |
Sort-Object -Property CPU -Descending|
Select-Object -First 15;
cls;
$tmp | Format-Table -Autosize -Property Name, CPU, PID, "Memory(MB)";
Start-Sleep 5
}
Выполняет все, что мне нужно, и дает мне отправную точку в будущем, чтобы строить дальше. Проблема, с которой я столкнулся с форматированием таблиц, заключается в том, что это format-table
должно быть последним.
решение1
Есть еще один способ запроса счетчиков производительности через WMI, который, я думаю, даст вам то, что вам нужно. Вывод также включает идентификатор процесса, что полезно при отслеживании процесса, имеющего несколько экземпляров. Он также использует то, что называется «вычисляемым свойством» внутри select-object
для преобразования значения рабочего набора из байтов в мегабайты. Также обратите внимание, что максимальный ЦП в 4-ядерной системе составляет 400, а не 100. Таким образом, чтобы получить общую загрузку (которая составляет максимум 100), вам нужно разделить значение ЦП каждого процесса на количество ядер.
$cores = (Get-WmiObject Win32_Processor).NumberOfLogicalProcessors
while ($true) {
Get-WmiObject Win32_PerfFormattedData_PerfProc_Process |
Where-Object {$_.Name -notmatch "^(idle|_total|system)$" -and $_.PercentProcessorTime -gt 0} |
Format-Table -Autosize -Property @{Name = "CPU"; Expression = {[int]($_.PercentProcessorTime/$cores)}}, Name, @{Name = "PID"; Expression = {$_.IDProcess}}, @{"Name" = "WSP(MB)"; Expression = {[int]($_.WorkingSetPrivate/1mb)}}
Start-Sleep 5
}
CPU Name PID WSP(MB)
--- ---- --------- -------
1 chrome 12476 64
2 wuauclt 7504 0
3 SearchIndexer 10128 22
4 TIworker 11380 102
решение2
while (1) {cls; Get-WmiObject Win32_PerfFormattedData_PerfProc_Process | select-object -property Name, PercentProcessorTime, IDProcess, @{"Name" = "WSP(MB)"; Expression = {[int]($_.WorkingSetPrivate/1mb)}} | ? {$_.Name -notmatch "^(idle|_total|system)$"} | Sort-Object -Property PercentProcessorTime -Descending| Select-Object -First 15 | ft Name, PercentProcessorTime, IDProcess, "WSP(MB)" -AutoSize; start-sleep 5}
Это то, что я искал. Спасибо @Clayton за отличную отправную точку. Вот объяснение того, что делает каждая часть.
while(1)
=> всегда работает
cls
=> очистить текущий экран
Get-WmiObject
=> используется для получения всей текущей информации о процессе
select-object
=> выберите только те столбцы данных, которые нужны
? {$_.Name -notmatch "^(idle|_total|system)$"}
=> удалить имена процессов, в первой части которых есть idle, _total или system
Sort-Object
=> сортировать процессы по использованию процессора в порядке убывания
Select-Object
=> выберите только первые 15 элементов (15 основных процессов ЦП)
ft
=> обеспечить форматирование таблицы с заголовками столбцов и использованием всего экрана
start-sleep
=> засыпание цикла для запуска примерно каждые 5 секунд