porcentaje de uso de cpu

Iniciado por navivan, 3 Marzo 2014, 23:15 PM

0 Miembros y 1 Visitante están viendo este tema.

navivan

Hola antes que nada como este es mi primer tema me presento me llamo ivan soy estudiante de ing en sistemas y tengo 18 años bueno este es mi problema espero me puedan ayudar tengo que realizar un script para medir el porcentaje de utilizacion del cpu por proceso
encontre el comando pslist para obtener el resultado que deseo pero el problema que ahorita tengo es que lo realice de esta forma

Código (dos) [Seleccionar]
@echo off
cd C:\Users\ETSSistemas
For /f "tokens=3 skip=1" %%x IN ('pslist -s 2 idle') Do set cpu=%%x

echo %cpu%
pause>nul
goto EOF


el resultado del puro comando 'pslist -s 2 idle' es este

04:13:17 p.m. 03/03/2014 Process information for ETSNBWIN7SIS:

Name                Pid CPU Thd  Hnd   Priv        CPU Time    Elapsed Time
Idle                  0  75   2    0      0     8:31:01.544     5:05:44.842
process idle was not found on ETSNBWIN7SIS


yo lo que necesito es el 75 pero al ejecutar el batch me da como resultado was
me podrian hechar la mano de antemano gracias y saludos




[MOD]: Utiliza el botón para insertar código.

Eleкtro

#1
Claro, en el output estás trabajando 5 lineas en total así que se procesa linea por linea para setear la variable, debes modificar la expresión del FOR para obtener la única linea que te interesa, prueba a reemplazar la expresión, por esta otra:

Código (dos) [Seleccionar]
'pslist.exe -s 2 idle ^| Findstr.exe "[0-9]:"'

De todas formas no necesitas utilizar herramientas de terceros, puedes hacerlo con el comando externo WMIC de Windows:
Código (dos) [Seleccionar]

@Echo OFF

Set    "ProcessName=Firefox"
Set /A "PercentCPU=0"

FOR /F "Tokens=2 Delims==" %%# IN (
'WMIC.exe Path Win32_PerfFormattedData_PerfProc_Process Where Name^="%ProcessName%" Get PercentProcessorTime /Format:List ^| FINDSTR.exe "[0-9]"'
) DO (
Set /A "PercentCPU=%%#"
)

Echo Process   : %ProcessName%
Echo CPU Usage : %PercentCPU%%%

Pause&Exit


Saludos.








navivan

muchas gracias me sirvio mucho y como me comentaste no habia necesidad de utilizar herramientas de terceros ya solo tuve que agregar unas pequeñas condiciones
para que funcionara como lo necesitaba y de nuevo muchas gracias

navivan

Perdon abusando de su confianza haber si me pueden ayudar ahora tengo que encontrar los 2 procesos mas utilizados y estoy utilizando
este codigo:

Código (dos) [Seleccionar]
wmic path win32_PerfFormattedData_PerfProc_Process get Name
,PercentProcessorTime >salida.txt


Este comando me muestra todos los procesos con su porcentaje de uso de cpu
mi idea fue mandar el resultado a un archivo de texto para poder ordenar el problema que ahora tengo es que no encuentro como ya que si hago

Código (dos) [Seleccionar]
sort salida.txt

si me ordena pero alfabeticamente y yo lo que necesito es que me lo ordene por la 2 fila y de mayor a menor no estoy seguro si se pueda me podrian ayudar

saludos

Eleкtro

#4
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:
Código (dos) [Seleccionar]
@echo off & setlocal enabledelayedexpansion

:: 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]"'
) Do (
REM Elimino caracteres unicode.
set "line=%%a"
set "line=!line:~0,-1!"
Echo !line!
))>"%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 n = UBound^(arr^)
Echo Do
Echo   nn = -1
Echo   For j = LBound^(arr^) to n - 1
Echo    num1 = cint^(split^(arr^(j^),","^)^(2^)^)
Echo    if not arr^(j+1^) = "" Then
Echo     num2 = cint^(split^(arr^(j+1^),","^)^(2^)^)
Echo    end if
Echo       If num1 ^< num2 Then
Echo          TempValue = arr^(j + 1^)
Echo          arr^(j + 1^) = arr^(j^)
Echo          arr^(j^) = TempValue
Echo          nn = j
Echo       End If
Echo   Next
Echo   n = nn
Echo Loop Until nn = -1
Echo For i = LBound^(arr^) To UBound^(arr^)
Echo   if not arr^(i^) = "" Then
Echo     WScript.Echo _
Echo     "Process: " ^& split^(arr^(i^),","^)^(1^) ^& ".exe" ^& vbnewline ^& _
Echo     "CPU....: " ^& split^(arr^(i^),","^)^(2^) ^& "%%"    ^& vbnewline
Echo      End If
Echo Next
)>"%TEMP%\SortWMIC.vbs"

CScript.exe /Nologo "%TEMP%\SortWMIC.vbs" "%TEMP%\WMIC.tmp"

Pause&Exit


Y el script de VisualBasicScript sin escapar los caracteres:

Código (vb) [Seleccionar]
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!








navivan

muchas gracias por tu ayuda y como me comentas sera mejor me cambiare a otro lenguaje
saludos

navivan

hola perdon que reviva el tema pero tal cual como me aconsejaste me cambie a vbs incluso tome como base el codigo que me hiciste favor de poner este es mi codigo ya modificado


Código (vb) [Seleccionar]

Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("Proceso.csv", ForReading)

arr = Split(objFile.ReadAll, VBcrlf)

n = UBound(arr)


Do
  nn = -1
  For j = LBound(arr)+1 to n - 1

num1 = split(arr(j)," ")

n1 = len(num1(0))
n1=36-n1
auxnum1=num1(n1)
numero1=Int(auxnum1)


    if not arr(j+1) = "" Then
    num2 = split(arr(j+1)," ")
n2=len(num2(0))
n2=36-n2


auxnum2=num2(n2)

numero2=Int(auxnum2)

    end if

      If numero1 < numero2 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
    AuxProc1 = split(arr(i)," ")
msgbox arr(i) 
if AuxProc1(0) = "_Total" then
numproc=i
end if
     End If

Next


al principio tuve varios problemas por que apesar de que el archivo fuera .csv los delimitadores eran espacios en blanco y no eran constantes es decir en algunos renglones los espacios eran 9 en otro 14 y asi eran variables los espacios entonces tuve que buscar como arreglar esa parte despues de solucionar eso me encontre con este error :

linea:30
Carácter:1
Error No coinciden los tipos 'auxnum2'
Código 800A000D

busque acerca de este error y encontre que posiblemente la variable era nula o no era numerica pero si yo en un imprimo en pantalla auxnum2 si me impremi solo numero por lo cual la varible en ninguno de los casos es nula y si es siempre un numero

Espero me puedan ayudar y no haberlos confundido con mi explicación

Saludos