1

Я могу использовать процент процессора ответа.

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" получит память, но id хотел бы, чтобы одновременно отображались задание, загрузка процессора и использование памяти.

ОБНОВЛЕНИЕ 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

Единственным недостатком этого является то, что он терпит неудачу после одного показа информации, и я не знаю почему. Любая помощь в этом?

UPDATE: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 должен быть последним.

2 ответа2

0

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 секунд

0

Есть другой способ запроса счетчиков производительности через 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .