![Windows PowerShell muestra el porcentaje de CPU y el uso de memoria.](https://rvso.com/image/1558677/Windows%20PowerShell%20muestra%20el%20porcentaje%20de%20CPU%20y%20el%20uso%20de%20memoria..png)
Puedo usar la respuestaPorcentaje de CPU.
While(1) { $p = get-counter '\Process(*)\% Processor Time'; cls;
$p.CounterSamples | sort -des CookedValue | select -f 15 | ft -a}
Ahora tengo problemas para poder mostrar el uso de memoria y el porcentaje de CPU al mismo tiempo para una tarea en la computadora. Sé Get-Counter "\Process(*)\Working Set - Private"
que obtendré la memoria, pero me gustaría que la tarea, el porcentaje de CPU y el uso de memoria se muestren al mismo tiempo.
ACTUALIZACIÓN 1:Idealmente, me gustaría poder ejecutar esto en PowerShell como un conjunto de comandos. Me gustaría que el resultado se muestre como:
Process Name CPU (%) Memory (MB) ------------ ------- -----------
Tomaré lo que pueda conseguir en lo que respecta a la visualización que se pueda manejar después de poder mostrar los tres elementos en PowerShell.
ACTUALIZACIÓN 2:Esta sección de código proporciona lo que me gustaría.
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}
Esto da como resultado la siguiente visualización:
Name PercentProcessorTime IDProcess WSP(MB)
---- -------------------- --------- -------
MicrosoftEdgeCP#3 6 18972 6 WmiPrvSE#3 6 27300 7
svchost#22 0 7316 1
El único inconveniente de esto es que falla después de una visualización de información y no sé por qué. ¿Alguna ayuda para esto?
ACTUALIZACIÓN: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
}
Cumple todo lo que necesito y me brinda un punto de partida en el futuro sobre el cual construir. El problema que tuve con el formateador de tablas es que format-table
debe ser el último.
Respuesta1
Hay otra forma de consultar los contadores de rendimiento a través de WMI que creo que le brindará lo que busca. El resultado también incluye la identificación del proceso, que es útil cuando se realiza el seguimiento de un proceso que tiene varias instancias. También utiliza lo que se llama una "propiedad calculada" select-object
para convertir el valor del conjunto de trabajo de bytes a megabytes. También tenga en cuenta que la CPU máxima en un sistema de 4 núcleos es 400, no 100. Entonces, para obtener la utilización general (que es un máximo de 100), debe dividir el valor de CPU de cada proceso por la cantidad 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
Respuesta2
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}
Esto es lo que estaba buscando. Gracias @Clayton por un excelente punto de partida. A continuación se explica lo que hace cada parte.
while(1)
=> siempre corriendo
cls
=> borrar la pantalla actual
Get-WmiObject
=> utilizado para obtener toda la información del proceso actual
select-object
=> seleccione solo las columnas de datos que desee
? {$_.Name -notmatch "^(idle|_total|system)$"}
=> eliminar los nombres de proceso que tienen inactivo, _total o sistema en la primera parte del nombre del proceso
Sort-Object
=> ordenar los procesos por uso de CPU en orden descendente
Select-Object
=> seleccione solo los primeros 15 elementos (15 procesos principales de la CPU)
ft
=> proporcionar formato de tabla con títulos de columna y usar toda la pantalla
start-sleep
=> dormir el bucle para que se ejecute aproximadamente cada 5 segundos