Creating-a-timeout-feature-in-powershell-scripts.jpg

Como crear una característica de límite de tiempo en scripts de PowerShell

Como crear una característica de límite de tiempo en scripts de PowerShell

No permita que su flujo de trabajo se detenga gracias al atascamiento de un solo script. ¡Existe la manera de evitar este contratiempo!

¿Alguna vez ha escrito un script útil en PowerShell y después queda en decepción al darse cuenta que se atasca en una tarea sin saber por qué? Es especialmente frustrante si el script fue ejecutado por un proceso automático. Todo el flujo de trabajo llega a un embotellamiento simplemente porque un solo scripts se atascó en alguna tarea. Afortunadamente, hay una manera de evitar que le ocurra. Para prevenir que esto le suceda a sus scripts, podemos agregarle una característica de límite de tiempo. Esta característica hará que el script se detenga o continúe si una determinada tarea tarda demasiado tiempo.

 

Para agregar un límites de tiempo a scripts de PowerShell, se requieren los siguientes componentes:

  • Comenzar un temporizador
  • Invocar el código
  • Revisar el estado del código de vez en cuando
  • Si se sobrepasa el tiempo límite, atenderlo
  • Si no se sobrepasa el tiempo límite, continuar con el script
  • Detener el temporizador

Veamos un ejemplo de cómo funcionará todo este proceso.

Lo primero que hay que hacer es definir un límite de tiempo. Normalmente, funcionará en segundos. Quiero asegurarme de que mi código no se tarde más de 10 segundos, así que estableceré una variable para eso.

$Timeout = 10 ## seconds

Después, tomaré el código que quiero y lo agregare a un scriptblock. Por ejemplo, imagine que he creado otros trabajos más arriba en el script y me gustaría esperar hasta que terminen su ejecución antes de continuar.

$jobs = Get-Job
$Condition = {param($jobs) 'Running' -not in $jobs.State }
$ConditionArgs = $jobs

Ahora, debo definir los intervalos de tiempo en los que tiene que realizar las tareas.

$RetryInterval = 5 ## seconds

Ahora comenzaré el temporizador.

## Start the timer
$timer = [Diagnostics.Stopwatch]::StartNew()

Ahora que ha iniciado el temporizador, puedo invocar el fragmento de código que quiero ejecutar.

## Start checking the condition scriptblock. Do this as long as the action hasn't exceeded
## the timeout or the condition scriptblock returns something other than $false or $null.
while (($timer.Elapsed.TotalSeconds -lt $Timeout) -and (& $Condition $ConditionArgs)) {

    ## Wait a specific interval
    Start-Sleep -Seconds $RetryInterval

    ## Check the time
    $totalSecs = [math]::Round($timer.Elapsed.TotalSeconds,0)
    Write-Verbose -Message "Still waiting for action to complete after [$totalSecs] seconds..."
}

Una vez que se haya excedido el tiempo límite, o que la tarea se haya completado, tendré que detener el temporizador.

## The action either completed or timed out. Stop the timer.
$timer.Stop()

Ahora puedo verificar si se excedió el tiempo límite o si la tarea se completó a tiempo. Aquí, incluiré una excepción para indicar si la acción no fue completada antes de que se haya alcanzado el tiempo límite. De lo contrario, escribiré una declaración para que cualquier código pueda ser ejecutado después de eso.

## Return status of what happened
if ($timer.Elapsed.TotalSeconds -gt $Timeout) {
    throw 'Action did not complete before timeout period.'
} else {
    Write-Verbose -Message 'Action completed before the timeout period.'
}

Para obtener la función Wait-Action que contenga todas estas funcionalidades en una sola función de PowerShell, descárguela de la Galería de PowerShell:

Install-Script -Name Wait-Action

Comments
Comments are disabled in preview mode.
Loading animation