windows powershell exibindo porcentagem de CPU e uso de memória

1

Eu posso usar a resposta porcentagem de CPU .

While(1) { $p = get-counter '\Process(*)\% Processor Time'; cls; $p.CounterSamples | sort -des CookedValue | select -f 15 | ft -a}

Agora, estou com problemas para ter o uso de memória e a porcentagem de CPU exibidos ao mesmo tempo para uma tarefa no computador. Eu sei que Get-Counter "\Process(*)\Working Set - Private" irá obter a memória, mas eu gostaria de ter tarefas,% de CPU e uso de memória sendo exibidos ao mesmo tempo.

UPDATE 1: Idealmente eu gostaria de poder executar isso em powershell como um conjunto de comandos. Eu gostaria que a saída fosse exibida como:

Process Name CPU (%) Memory (MB) ------------ ------- -----------

Eu vou pegar o que eu posso conseguir quando ele aparecer para mostrar que pode ser tratado depois de poder apenas exibir os três itens no powershell.

UPDATE 2: Esta seção do código fornece o que eu gostaria

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}

Isso resulta na seguinte exibição:

Name PercentProcessorTime IDProcess WSP(MB) ---- -------------------- --------- ------- MicrosoftEdgeCP#3 6 18972 6 WmiPrvSE#3 6 27300 7 svchost#22 0 7316 1

Apenas desvantagem disso é que ele falha após uma exibição de informações e não sei por quê. Alguma ajuda para isso?

ATUALIZAÇÃO: 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 }

Realiza tudo o que eu preciso e me dá um ponto de partida no futuro para se construir. O problema que tive com o formatador de tabela é que format-table deve ser o último.

    
por Keith Bux 16.04.2018 / 15:25

2 respostas

0

Há outra maneira de consultar os contadores de desempenho por meio do WMI que, acredito, fornecerá o que você deseja depois. A saída também inclui o ID do processo, que é útil ao rastrear um processo que possui várias instâncias. Ele também usa o que é chamado de "propriedade calculada" em select-object para converter o valor do conjunto de trabalho de bytes em megabytes. Observe também que a CPU máxima em um sistema de 4 núcleos é de 400, não de 100. Portanto, para obter a utilização geral (que é um máximo de 100), é necessário dividir o valor de CPU de cada processo pelo número de núcleos.

$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
    
por 16.04.2018 / 23:00
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}

Isso é o que eu estava procurando. Obrigado @Clayton por um excelente ponto de partida. Aqui está uma explicação para o que cada parte faz.

while(1) = > sempre correndo

cls = > limpar a tela atual

Get-WmiObject = > usado para obter todas as informações do processo atual

select-object = > selecione apenas as colunas de dados que são desejadas

? {$_.Name -notmatch "^(idle|_total|system)$"} = > remova os nomes de processos que têm ocioso, _total ou sistema na primeira parte do nome do processo

Sort-Object = > ordenar os processos por uso de cpu em ordem decrescente

Select-Object = > selecione apenas os primeiros 15 itens (os principais processos de 15 cpu)

ft = > fornecer formatação de tabela com títulos de colunas e usar toda a tela

start-sleep = > durma o ciclo para correr aproximadamente a cada 5 segundos

    
por 17.04.2018 / 16:08

Tags