Quiero ejecutar repetidamente un programa en un bucle.

A veces, el programa se bloquea, así que me quieren matar por lo que la siguiente iteración puede iniciar correctamente. Puedo determinar a través de este tiempo de espera.

Tengo el tiempo de espera de trabajo, pero no puede obtener el Código de Salida del programa, que también me necesita para determinar su resultado.

Antes, yo no se hizo esperar con el tiempo de espera, pero sólo se utiliza -esperar en el Inicio del Proceso, pero esto hizo que el script se bloquea si el inicio del programa se estrelló. Con esta configuración podría correctamente obtener el código de salida, aunque.

Yo soy la ejecución de ISE.

for ($i=0; $i -le $max_iterations; $i++)
{
    $proc = Start-Process -filePath $programtorun -ArgumentList $argumentlist -workingdirectory $programtorunpath -PassThru
    # wait up to x seconds for normal termination
    Wait-Process -Timeout 300 -Name $programname
    # if not exited, kill process
    if(!$proc.hasExited) {
        echo "kill the process"
        #$proc.Kill() <- not working if proc is crashed
        Start-Process -filePath "taskkill.exe" -Wait -ArgumentList '/F', '/IM', $fullprogramname
    }
    # this is where I want to use exit code but it comes in empty
    if ($proc.ExitCode -ne 0) {
       # update internal error counters based on result
    }
}

¿Cómo puedo

  1. Iniciar un proceso de
  2. Esperar a ordenado ejecutar y terminar
  3. Matar si es que se estrelló (e. g. éxitos de tiempo de espera)
  4. obtener el código de salida de proceso

1 Comentario

  1. 12

    Usted puede terminar el proceso más simple de usar $proc | kill o $proc.Kill(). Tenga en cuenta que usted no será capaz de recuperar un código de salida en este caso, en lugar de simplemente actualizar el error interno contador:

    for ($i=0; $i -le $max_iterations; $i++)
    {
        $proc = Start-Process -filePath $programtorun -ArgumentList $argumentlist -workingdirectory $programtorunpath -PassThru
    
        # keep track of timeout event
        $timeouted = $null # reset any previously set timeout
    
        # wait up to x seconds for normal termination
        $proc | Wait-Process -Timeout 4 -ErrorAction SilentlyContinue -ErrorVariable timeouted
    
        if ($timeouted)
        {
            # terminate the process
            $proc | kill
    
            # update internal error counter
        }
        elseif ($proc.ExitCode -ne 0)
        {
            # update internal error counter
        }
    }
    • Gracias! La Espera-Proceso de espera correctamente para 400s en su solución, pero el «# terminar el proceso» cláusula no llega después de tiempo de espera – así también, el proceso nunca es asesinado, y después de la siguiente iteración, 2 procesos se están ejecutando. (He probado con un pequeño tiempo de espera para forzar este caso).
    • Tienes razón, yo pensaba Esperar-Proceso de devolver algo. He editado mi respuesta, ahora me asignar el mensaje de error a $timeouted y en caso de que un tiempo de espera de ocurrido, se establece.
    • Gracias! (Hubo un menor error ortográfico). Un gran trabajo!
    • Usted puede elaborar sobre lo que el -ea 0 -ev timeouted son los valores? No puedo encontrar estos documentado en ninguna parte, pero me es necesario para determinar si un compás de Espera Proceso de tiempo de espera agotado o no, y parece que esos son lo que usted está utilizando en el ejemplo de código.
    • Lo siento, no deberían los alias utilizados. ea significa ErrorAction y 0 es el valor de enumeración para SilentlyContinue – así que me puse el ErrorAction para esta línea de SilentlyContinue (que impide que el script se detendrá si se ha producido un error). -ev significa ErrorVariable. Yo, básicamente, definir que si un error occurres, escribir a la $timeout variable.
    • Gracias por el edit – me debe evitar el alias…

Dejar respuesta

Please enter your comment!
Please enter your name here