usar sistema simbolo que puede hacer con como comandos basicos sorting process cmd wmic tasklist

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