sorting - simbolo - ¿Puede una tabla de procesos wmic(dentro de la ventana del símbolo del sistema) ser ordenada por un valor?
que se puede hacer con cmd (5)
Esto podría funcionar en la línea de comandos (depende de la versión de Windows, sin ninguna garantía):
(for /f "delims=" %i in (''wmic process get Name^, ProcessId^, WorkingSetSize '') do @set "wss=%i" &call set "wss=%wss:~0,35%%wss:~-12%"&call echo(%wss%) | more +1 | sort /+35
He estado explorando varias opciones, como el indicador /format
, sin embargo, parece que la clasificación solo es posible en resultados XML o HTML. Me gustaría ordenarlo en el símbolo del sistema. Parece que incluso TaskList no puede hacer esto (y preferiría usar wmic ya que parece funcionar más rápido).
Un ejemplo de un comando para ejecutar sería wmic process get name,processid,workingsetsize
. Los procesos parecen estar ordenados por processid, pero tendría mucho más sentido (en mi caso de uso, al menos) ordenar por nombre o uso de memoria ( workingsetsize
).
Según lo solicitado, aquí hay un ejemplo de salida de tabla de proceso wmic:
Name ProcessId WorkingSetSize
System Idle Process 0 20480
System 4 765952
smss.exe 384 393216
csrss.exe 500 2850816
wininit.exe 596 774144
csrss.exe 612 6230016
winlogon.exe 672 2023424
services.exe 696 7192576
lsass.exe 704 9814016
svchost.exe 820 5287936
svchost.exe 872 7454720
atiesrxx.exe 936 1028096
Obviamente, las listas de procesos pueden ser muy largas, así que lo corté allí.
Utilicé la técnica de Peter aquí pero devolví los datos en formato CSV, que es más fácil de analizar para un archivo por lotes en formato "PID, WorkingSetSize, Name" ordenado en la columna de tamaño.
@ECHO OFF
SETLOCAL
FOR /f "delims==" %%i IN (''set $ 2^>nul'') DO SET "%%i="
FOR /f "skip=2 tokens=2-4 delims=," %%a IN (''cmd /c "wmic process get Name, ProcessId, WorkingSetSize /format:csv" '') DO (
SET wss=0000000000000000000%%c
CALL SET $%%wss:~-20%%=%%b,%%c,%%a
)
FOR /f "tokens=1*delims==" %%i IN (''set $'') DO ECHO(%%j
pause
¿Te sirve esto? Funciona en Win 8 para proporcionar una lista de procesos ordenados por uso de memoria.
tasklist /nh |sort /+65
@ECHO OFF
SETLOCAL
FOR /f "delims==" %%i IN (''set $ 2^>nul'') DO SET "%%i="
FOR /f "delims=" %%i IN (''wmic process get Name^, ProcessId^, WorkingSetSize '') DO (
IF DEFINED $0 (
SET wss=%%i
CALL SET wss=0000000000000000000%%wss:~60%%
CALL SET wss=%%wss: =%%
CALL SET wss=$%%wss:~-20%%
CALL SET %%wss%%=%%i
) ELSE (SET $0=%%i)
)
FOR /f "tokens=1*delims==" %%i IN (''set $'') DO ECHO(%%j
Esto debería hacer tu tipo.
Los puntos WMIC
son: el comando WMIC
requiere comas entre nombres de campo. Estos deben ser escapados en el for/f
Todas las variables de entorno que empiezan por "$" se eliminan primero, luego se procesa cada línea de WMIC
. La primera línea (el encabezado) se guarda en $0
luego cada línea se guarda en $size
El truco aquí es que SIZE en la lista no solo está justificado a la izquierda por espacio-acolchado, por lo tanto, la cadena de ceros se antepone primero al contenido de la columna de workingsetsize que probablemente comienza en la columna 62, pero la columna 61 es un espacio. Se usa "60" ya que la instalación de la subcadena cuenta desde la columna 0, no desde la columna 1.
Luego, cada espacio se reemplaza por [nada], eliminando los espacios finales (también convenientemente, el espacio de la columna 61)
Los últimos 20 caracteres de la cadena resultante forman una versión llena de cero de la columna de tamaño de trabajo.
anteponer $ a tha, y establecer la variable resultante a los contenidos de la línea que la generó
Finalmente, enumerar los contenidos de las variables $
produce la lista requerida en el orden requerido.
Tenga en cuenta que las afirmaciones de que el resultado del proceso de WMIC
se encuentra en orden es lo que sea erróneo. Un examen más detallado revelaría que no está en el orden de ProcessID, ni alfabéticamente (ya que esa columna también está justificada a la izquierda) ni alfabéticamente.
OK: la versión revisada debe ajustarse automáticamente al ancho de la columna del nombre del proceso:
@ECHO OFF
SETLOCAL
FOR /f "delims==" %%i IN (''set $ 2^>nul'') DO SET "%%i="
SET /A COUNT=0
FOR /f "delims=" %%i IN (''wmic process get Name^, ProcessId^, WorkingSetSize '') DO (
IF DEFINED $0 (
SET wss=%%i
CALL %%lopcmd%%
CALL SET wss2=%%wss2: =%%
SET /A COUNT+=1
CALL SET wss=$%%wss2:~-20%%%%COUNT%%
CALL SET %%wss%%=%%i
) ELSE (SET $0=%%i&set/a wsscol=0&CALL :findcol&SET $0=%%i)
)
FOR /f "tokens=1*delims==" %%i IN (''set $'') DO ECHO(%%j
GOTO :eof
:findcol
IF "%$0:~0,1%"=="W" SET lopcmd=CALL SET wss2=0000000000000000000%%wss:~%wsscol%%%&GOTO :eof
SET $0=%$0:~1%
SET /a wsscol+=1
GOTO findcol
Sin cambios sustanciales: simplemente calcule el ancho requerido ubicando la "W" en el encabezado y estableciendo un comando apropiado para configurar la variable lista para el procesamiento ... y que se debe ejecutar usando el método CALL %%var%%
...
Edición menor: introducir COUNT para distinguir entre líneas con tamaños de conjuntos de trabajo idénticos. Count
simplemente extiende el nombre de variable utilizado para ordenar y hace que el nombre sea único.
Entiendo tu pregunta y esto funciona muy bien para mí en Windows 10:
wmic process list get name, version |sort
or
wmic process list status |sort
or
wmic process list io |sort
Explicando sobre la respuesta de Foxidrive, esto funciona con la lista de tareas también:
tasklist /nh | sort
y sin necesidad del / + 65 (gracias por esa información foxidrive)
"tasklist" en Windows 10 hará esto también:
tasklist /nh /fo table
or
tasklist /fo list
or
tasklist /nh |sort