Powershell: Medir tiempo ejecución de un proceso o script
Hoy vamos a explicaros varios métodos para poder medir el tiempo de ejecución de procesos, ejecutables o scripts, mediante comandos de Powershell u otros métodos que nos da el sistema Windows para su análisis.
Partiremos del comando “Get-Process” que nos dará todos los procesos que se están ejecutando en el sistema:
A partir de dicho comando, vamos a ir filtrando la información que nos puede dar, para poder saber el tiempo de ejecución del mismo, por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
PS C:\Users\elblogdenegu> Get-Process chrome | select name, starttime Name StartTime ---- --------- chrome 14/01/2024 11:58:46 chrome 14/01/2024 11:58:40 chrome 14/01/2024 12:00:38 chrome 14/01/2024 11:58:40 chrome 14/01/2024 11:59:05 chrome 14/01/2024 11:58:39 chrome 14/01/2024 11:58:41 chrome 14/01/2024 11:58:39 chrome 14/01/2024 11:58:39 chrome 14/01/2024 11:58:39 chrome 14/01/2024 11:58:39 chrome 14/01/2024 11:58:44 chrome 14/01/2024 12:00:34 chrome 14/01/2024 11:58:40 |
Otros comandos que os van a mostrar información de procesos son:
1 |
Get-CimInstance -ClassName Win32_Process |
1 |
Get-WmiObject Win32_Process -filter "name = 'chrome.exe'" |
Si queremos extraer el usuario que lo ha ejecutado:
1 2 |
(Get-WmiObject Win32_Process | ?{ $_.ProcessName -match "CalculatorApp" }).GetOwner().User ELBLOGDENEGU |
Si queréis lanzarlo a un PC remoto:
1 |
Get-WmiObject Win32_Process -ComputerName localhost | ?{ $_.ProcessName -match "Calculatorapp" } |
Con estos comando procedemos a filtrar para extraer la hora de ejecución de un proceso.
Comando Powershell para saber hora ejecución de proceso y usuario
Podemos extraer el usuario, el nombre del proceso que ha lanzado y la hora de arranque mediante el siguiente comando:
1 2 3 4 5 |
PS C:\Users\elblogdenegu> Get-Process CalculatorApp -IncludeUserName | select processname,starttime,username ProcessName StartTime UserName ---- --------- -------- CalculatorApp 01/01/2024 9:21:15 ELBLOGDENEGU\RAUL |
Otra forma de extraerlo podría ser:
1 2 3 4 5 6 7 8 9 10 11 12 |
PS C:\Users\elblogdenegu> (Get-Date).Subtract((Get-Process CalculatorApp).starttime) Days : 0 Hours : 0 Minutes : 25 Seconds : 46 Milliseconds : 15 Ticks : 15460152514 TotalDays : 0,0178936950393519 TotalHours : 0,429448680944444 TotalMinutes : 25,7669208566667 TotalSeconds : 1546,0152514 |
Procesos relacionados con las ventanas en ejecución de un usuario
Si queréis extraer los procesos relacionados con las ventanas ejecutadas:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
PS C:\WINDOWS\system32> Get-Process | Where-Object {$_.mainWindowTitle} | Format-Table Id, Name, mainWindowtitle -AutoSize Id Name MainWindowTitle -- ---- --------------- 6488 ApplicationFrameHost Configuración 5560 CalculatorApp Calculadora 12996 chrome El Blog de Negu - Google Chrome 5600 mmc Visor de eventos 7180 msedge YouTube - Personal: Microsoft Edge 17180 ONENOTE Powershell: Medir tiempo ejecución de un proceso - OneNote 1372 powershell_ise Administrador: Windows PowerShell ISE 15008 SystemSettings Configuración 2076 WindowsTerminal Windows PowerShell |
Comprobar mediante Visor de Eventos ejecución aplicaciones
Es posible ver la ejecución de procesos mediante el visor de eventos, los IDs a buscar son 4688 (comienzo) y 4689 (parada). Para ello deberemos activar la auditoría la creación de procesos.
Os dejo un par de entradas relacionadas:
Analizar Logon Delay con el Visor de eventos en Citrix
Medir el tiempo de ejecución de un script o comando
Por ejemplo, para poder medir cuanto tiempo tarda un script o comando, podéis usar el comando:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
PS C:\Users\elblogdenegu> Measure-Command { Get-Process CalculatorApp -IncludeUserName | select name,starttime,username } Days : 0 Hours : 0 Minutes : 0 Seconds : 0 Milliseconds : 7 Ticks : 71579 TotalDays : 8,28460648148148E-08 TotalHours : 1,98830555555556E-06 TotalMinutes : 0,000119298333333333 TotalSeconds : 0,0071579 TotalMilliseconds : 7,1579 |
Para un script:
1 |
Measure-Command {C:\Scripts\Test.ps1} |
Extraer los minutos de ejecución entre fechas
Si lo que necesitáis es extraer los minutos de diferencia entre la fecha actual y la del comienzo de la ejecución, podéis formatear la salida y restarla, por ejemplo:
1 2 3 4 |
$Fecha1 = (Get-Date (Get-Process CalculatorApp).StartTime) $Fecha2 = Get-Date -Format "dd/MM/yyyy HH:mm:ss" $Fecha2 = [DateTime]::ParseExact($Fecha2, "dd/MM/yyyy HH:mm:ss", $null) ($Fecha2 - $Fecha1).TotalMinutes |
Podéis extraer, horas, días, minutos…
Generar script Powershell para extraer información ejecución de un proceso
Podéis completar estos comandos completando la información de consumo de CPU, RAM, Usuario, PC, Hora de ejecución…
1 2 3 4 5 6 7 |
$proceso = Get-Process CalculatorApp $tiempo = (get-date).Subtract($proceso.starttime) $minutos = $tiempo.Minutes $usuario = (Get-WmiObject Win32_Process | ?{ $_.ProcessName -match "CalculatorApp" }).GetOwner().User $cpu = $proceso.cpu $ram = $proceso.ws / 1MB $pc = [System.Net.Dns]::GetHostName() |
Si por ejemplo, un caso de uso, queréis revisar en un servidor el uso de una aplicación, podéis encerrar el script en un “for” que generará un bucle infinito y programar tareas de windows con el script:
1 2 3 |
for(;;){ #Codigo de la aplicación } |
Y podéis completarlo con el envío por correo:
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?