![windows powershell exibindo porcentagem de CPU e uso de memória](https://rvso.com/image/1558677/windows%20powershell%20exibindo%20porcentagem%20de%20CPU%20e%20uso%20de%20mem%C3%B3ria.png)
Eu sou capaz de usar a respostaPorcentagem de CPU.
While(1) { $p = get-counter '\Process(*)\% Processor Time'; cls;
$p.CounterSamples | sort -des CookedValue | select -f 15 | ft -a}
Agora estou tendo problemas para exibir o uso de memória e a porcentagem de CPU ao mesmo tempo para uma tarefa no computador. Eu sei Get-Counter "\Process(*)\Working Set - Private"
que obterei a memória, mas gostaria que a tarefa,% de CPU e uso de memória fossem exibidos ao mesmo tempo.
ATUALIZAÇÃO 1:Idealmente, eu gostaria de poder executar isso no PowerShell como um conjunto de comandos. Gostaria que a saída fosse exibida como:
Process Name CPU (%) Memory (MB) ------------ ------- -----------
Vou pegar o que posso conseguir quando se trata de exibição que pode ser tratada depois de ser capaz de exibir apenas os três itens no PowerShell.
ATUALIZAÇÃO 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
A única 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 preciso e me dá um ponto de partida no futuro para construir. O problema que tive com o formatador de tabela é que format-table
deve ser o último.
Responder1
Existe outra maneira de consultar contadores de desempenho via WMI que acredito que fornecerá o que você procura. 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" select-object
para converter o valor do conjunto de trabalho de bytes para megabytes. Observe também que a CPU máxima em um sistema de 4 núcleos é 400, não 100. Portanto, para obter a utilização geral (sendo um máximo de 100), você precisa dividir o valor da 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
Responder2
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 sobre o que cada parte faz.
while(1)
=> sempre correndo
cls
=> limpar a tela atual
Get-WmiObject
=> usado para obter todas as informações atuais do processo
select-object
=> selecione apenas as colunas de dados desejadas
? {$_.Name -notmatch "^(idle|_total|system)$"}
=> remova os nomes dos processos que possuem inativo, _total ou sistema na primeira parte do nome do processo
Sort-Object
=> classifique os processos por uso da CPU em ordem decrescente
Select-Object
=> selecione apenas os primeiros 15 itens (15 principais processos de CPU)
ft
=> fornecer formatação de tabela com títulos de colunas e usando a tela inteira
start-sleep
=> suspenda o loop para executar aproximadamente a cada 5 segundos