Para ser sincero no suelo ayudar nada en este tipo de tareas complejas en Batch, ya que como podrás comprobar a continuación, Batch es tán simple y escaso de utilidades que eso lo convierte en su peor enemigo, ya que por su limitada escasez de elementos de programación actual (un maldito Array, por ejemplo), requiere un sacrificio enorme y demasiado esfuerzo para
malgastar invertir un tiempo de escritura elevado para llevar a cabo ciertas tareas que en cualquier otro lenguaje (decente) se podría realizar en menos de 10 lineas o en un equivalente de 5 minutos, y por supuesto con un código mucho más óptimo y una gran diferencia de rendimiento comparado con lo que se puede llegar a conseguir en Batch (o VBS).
Es un engorro y también lo considero una pérdida de tiempo hacer este tipo de cosas en Batch/VBS, y por ese motivo no creo que lo vuelva a hacer de aquí a mucho tiempo, me limitaré a recomendar el uso de lenguajes de verdad.
El siguiente Script escribe la salida de la
query del comando WMIC, en formato CSV (delimitado por comas), en un archivo de texto,
Y después envio el archivo de texto como parámetro de un archivo VBS préviamente escrito con las instrucciones necesarías para partir el contenido del archivo de texto en un Array e iterar los elementos para hacer un BubbleSort y así ordenar los elementos de forma numérica de mayor a menor porcentaje, y no ordenar como texto,
por último, enviio la salida a la consola, un
output que puedes customizar de la manera que quieras modificando el Script VBS y puedes capturar dicha salida con el comando
FOR /F en Batch si fuese necesario, yo dejé la salida así:
El Script:
:: By Elektro
REM Obtengo los processos
(For /F "Tokens=*"
%%a in ( 'wmic.exe path win32_PerfFormattedData_PerfProc_Process get PercentProcessorTime^,Name /Format:csv ^| FINDSTR "[0-9]"'
REM Elimino caracteres unicode.
))>"%TEMP%\WMIC.tmp"
(
Echo Set objFSO = CreateObject
^("Scripting.FileSystemObject"
^) Echo Set objFile = objFSO.OpenTextFile
^(Wscript.Arguments
^(0
^), 1
^) Echo arr = Split
^(objFile.ReadAll, VBcrlf
^) Echo For j = LBound
^(arr
^) to n - 1
Echo num1 = cint
^(split
^(arr
^(j
^),","
^)^(2
^)^) Echo num2 = cint
^(split
^(arr
^(j+1
^),","
^)^(2
^)^) Echo TempValue = arr
^(j + 1
^) Echo arr
^(j + 1
^) = arr
^(j
^) Echo arr
^(j
^) = TempValue
Echo For i = LBound
^(arr
^) To UBound
^(arr
^) Echo "Process: "
^& split
^(arr
^(i
^),","
^)^(1
^) ^& ".exe"
^& vbnewline
^& _
Echo "CPU....: "
^& split
^(arr
^(i
^),","
^)^(2
^) ^& "
%%"
^& vbnewline
)>"%TEMP%\SortWMIC.vbs"
CScript.exe /Nologo "%TEMP%\SortWMIC.vbs" "%TEMP%\WMIC.tmp"
Y el script de VisualBasicScript sin escapar los caracteres:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(Wscript.Arguments(0), 1)
arr = Split(objFile.ReadAll, VBcrlf)
n = UBound(arr)
Do
nn = -1
For j = LBound(arr) to n - 1
num1 = cint(split(arr(j),",")(2))
if not arr(j+1) = "" Then
num2 = cint(split(arr(j+1),",")(2))
end if
If num1 < num2 Then
TempValue = arr(j + 1)
arr(j + 1) = arr(j)
arr(j) = TempValue
nn = j
End If
Next
n = nn
Loop Until nn = -1
For i = LBound(arr) To UBound(arr)
if not arr(i) = "" Then
WScript.Echo _
"Process: " & split(arr(i),",")(1) & ".exe" & vbnewline & _
" CPU...: " & split(arr(i),",")(2) & "%" & vbnewline
End If
Next
Saludos!