elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  porcentaje de uso de cpu
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: porcentaje de uso de cpu  (Leído 6,386 veces)
navivan

Desconectado Desconectado

Mensajes: 10


Ver Perfil
porcentaje de uso de cpu
« en: 3 Marzo 2014, 23:15 pm »

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
  1. @echo off
  2. cd C:\Users\ETSSistemas
  3. For /f "tokens=3 skip=1" %%x IN ('pslist -s 2 idle') Do set cpu=%%x
  4.  
  5. echo %cpu%
  6. pause>nul
  7. goto EOF

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

Código:
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.


« Última modificación: 4 Marzo 2014, 09:55 am por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: porcentaje de uso de cpu
« Respuesta #1 en: 4 Marzo 2014, 10:22 am »

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
  1. '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
  1. @Echo OFF
  2.  
  3. Set    "ProcessName=Firefox"
  4. Set /A "PercentCPU=0"
  5.  
  6. FOR /F "Tokens=2 Delims==" %%# IN (
  7. 'WMIC.exe Path Win32_PerfFormattedData_PerfProc_Process Where Name^="%ProcessName%" Get PercentProcessorTime /Format:List ^| FINDSTR.exe "[0-9]"'
  8. ) DO (
  9. Set /A "PercentCPU=%%#"
  10. )
  11.  
  12. Echo Process   : %ProcessName%
  13. Echo CPU Usage : %PercentCPU%%%
  14.  
  15. Pause&Exit

Saludos.


« Última modificación: 4 Marzo 2014, 10:25 am por Eleкtro » En línea



navivan

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: porcentaje de uso de cpu
« Respuesta #2 en: 4 Marzo 2014, 17:47 pm »

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
En línea

navivan

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: porcentaje de uso de cpu
« Respuesta #3 en: 4 Marzo 2014, 23:45 pm »

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
  1. wmic path win32_PerfFormattedData_PerfProc_Process get Name
  2. ,PercentProcessorTime >salida.txt
  3.  

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
  1. 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
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: porcentaje de uso de cpu
« Respuesta #4 en: 5 Marzo 2014, 12:11 pm »

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
  1. @echo off & setlocal enabledelayedexpansion
  2.  
  3. :: By Elektro
  4.  
  5. REM Obtengo los processos
  6. (For /F "Tokens=*" %%a in (
  7. 'wmic.exe path win32_PerfFormattedData_PerfProc_Process get PercentProcessorTime^,Name /Format:csv ^| FINDSTR "[0-9]"'
  8. ) Do (
  9. REM Elimino caracteres unicode.
  10. set "line=%%a"
  11. set "line=!line:~0,-1!"
  12. Echo !line!
  13. ))>"%TEMP%\WMIC.tmp"
  14.  
  15. (
  16. Echo Set objFSO = CreateObject^("Scripting.FileSystemObject"^)
  17. Echo Set objFile = objFSO.OpenTextFile^(Wscript.Arguments^(0^), 1^)
  18. Echo arr = Split^(objFile.ReadAll, VBcrlf^)
  19. Echo n = UBound^(arr^)
  20. Echo   nn = -1
  21. Echo   For j = LBound^(arr^) to n - 1
  22. Echo    num1 = cint^(split^(arr^(j^),","^)^(2^)^)
  23. Echo    if not arr^(j+1^) = "" Then
  24. Echo     num2 = cint^(split^(arr^(j+1^),","^)^(2^)^)
  25. Echo    end if
  26. Echo       If num1 ^< num2 Then
  27. Echo          TempValue = arr^(j + 1^)
  28. Echo          arr^(j + 1^) = arr^(j^)
  29. Echo          arr^(j^) = TempValue
  30. Echo          nn = j
  31. Echo       End If
  32. Echo   Next
  33. Echo   n = nn
  34. Echo Loop Until nn = -1
  35. Echo For i = LBound^(arr^) To UBound^(arr^)
  36. Echo   if not arr^(i^) = "" Then
  37. Echo     WScript.Echo _
  38. Echo     "Process: " ^& split^(arr^(i^),","^)^(1^) ^& ".exe" ^& vbnewline ^& _
  39. Echo     "CPU....: " ^& split^(arr^(i^),","^)^(2^) ^& "%%"    ^& vbnewline
  40. Echo      End If
  41. Echo Next
  42. )>"%TEMP%\SortWMIC.vbs"
  43.  
  44. CScript.exe /Nologo "%TEMP%\SortWMIC.vbs" "%TEMP%\WMIC.tmp"
  45.  
  46. Pause&Exit

Y el script de VisualBasicScript sin escapar los caracteres:

Código
  1. Set objFSO = CreateObject("Scripting.FileSystemObject")
  2. Set objFile = objFSO.OpenTextFile(Wscript.Arguments(0), 1)
  3.  
  4. arr = Split(objFile.ReadAll, VBcrlf)
  5.  
  6. n = UBound(arr)
  7.  
  8. Do
  9.  nn = -1
  10.  For j = LBound(arr) to n - 1
  11.  
  12.    num1 = cint(split(arr(j),",")(2))
  13.  
  14.    if not arr(j+1) = "" Then
  15.     num2 = cint(split(arr(j+1),",")(2))
  16.    end if
  17.  
  18.      If num1 < num2 Then
  19.         TempValue = arr(j + 1)
  20.         arr(j + 1) = arr(j)
  21.         arr(j) = TempValue
  22.         nn = j
  23.      End If
  24.  
  25.  Next
  26.  
  27.  n = nn
  28.  
  29. Loop Until nn = -1
  30.  
  31. For i = LBound(arr) To UBound(arr)
  32.  
  33.     if not arr(i) = "" Then
  34.     WScript.Echo _
  35.     "Process: " & split(arr(i),",")(1) & ".exe" & vbnewline & _
  36.     " CPU...: " & split(arr(i),",")(2) & "%"    & vbnewline
  37.     End If
  38.  
  39. Next    

Saludos!
« Última modificación: 5 Marzo 2014, 12:24 pm por Eleкtro » En línea



navivan

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: porcentaje de uso de cpu
« Respuesta #5 en: 6 Marzo 2014, 00:42 am »

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

navivan

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: porcentaje de uso de cpu
« Respuesta #6 en: 12 Marzo 2014, 18:07 pm »

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
  1. Const ForReading = 1
  2. Set objFSO = CreateObject("Scripting.FileSystemObject")
  3. Set objFile = objFSO.OpenTextFile("Proceso.csv", ForReading)
  4.  
  5. arr = Split(objFile.ReadAll, VBcrlf)
  6.  
  7. n = UBound(arr)
  8.  
  9.  
  10. Do
  11.  nn = -1
  12.  For j = LBound(arr)+1 to n - 1
  13.  
  14. num1 = split(arr(j)," ")
  15.  
  16. n1 = len(num1(0))
  17. n1=36-n1
  18. auxnum1=num1(n1)
  19. numero1=Int(auxnum1)
  20.  
  21.  
  22.    if not arr(j+1) = "" Then
  23.     num2 = split(arr(j+1)," ")
  24. n2=len(num2(0))
  25. n2=36-n2
  26.  
  27.  
  28. auxnum2=num2(n2)
  29.  
  30. numero2=Int(auxnum2)
  31.  
  32.    end if
  33.  
  34.      If numero1 < numero2 Then
  35.         TempValue = arr(j + 1)
  36.         arr(j + 1) = arr(j)
  37.         arr(j) = TempValue
  38.         nn = j
  39.      End If
  40.  
  41.  Next
  42.  
  43.  
  44.  n = nn
  45.  
  46. Loop Until nn = -1
  47.  
  48.  
  49. For i = LBound(arr) To UBound(arr)
  50.  
  51.     if not arr(i) = "" Then
  52.     AuxProc1 = split(arr(i)," ")
  53. msgbox arr(i)  
  54. if AuxProc1(0) = "_Total" then
  55. numproc=i
  56. end if
  57.     End If
  58.  
  59. Next
  60.  

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


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
progressbar porcentaje
Programación Visual Basic
alfa_28 7 6,626 Último mensaje 21 Septiembre 2006, 06:40 am
por Zibra
Duda con el uso de porcentaje
Java
arts 2 1,872 Último mensaje 3 Enero 2014, 01:56 am
por arts
error porcentaje jiayu
Dispositivos Móviles (PDA's, Smartphones, Tablets)
lukaszg_15 1 2,113 Último mensaje 27 Abril 2014, 17:52 pm
por lukaszg_15
porcentaje en c
Programación C/C++
lucas59 2 6,502 Último mensaje 5 Octubre 2014, 13:36 pm
por eferion
Añadir porcentaje al progressBar
.NET (C#, VB.NET, ASP)
Meta 5 12,560 Último mensaje 1 Marzo 2016, 10:39 am
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines