es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo hacer un bucle hasta que el proceso esté en ejecución, permitir que se ejecute durante 60 segundos, detener el proceso y romper el bucle.

Intenté reutilizar otro script para que se repitiera hasta que el proceso BCRMODESET esté en ejecución, permitiendo que se ejecute durante 60 segundos, luego se interrumpe el proceso y se rompe el bucle.

Si el proceso ya está en ejecución y solo ejecuto el contenido del bucle, se interrumpe el proceso como debería después de 60 segundos. Sin embargo, si ejecuto todo el script, nunca se interrumpe el proceso una vez que ha comenzado a ejecutarse.

Start-Process C:\Userdata\Barcode2COM.exe

for ($i=0; $i -le $max_iterations; $i++)
{
    $proc = Get-Process -Name BCR_MODE_SET

    # keep track of timeout event
    $timeouted = $null # reset any previously set timeout

    # wait up to x seconds for normal termination
    $proc | Wait-Process -Timeout 60 -ErrorAction SilentlyContinue -ErrorVariable timeouted

    if ($timeouted)
    {
        # terminate the process
        $proc | kill
    }
    elseif ($proc.ExitCode -ne 0)
    {
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El fragmento de código anterior tiene como objetivo reutilizar un script existente para que se ejecute en un bucle continuo hasta que el proceso “BCR_MODE_SET” esté en ejecución, permita que se ejecute durante 60 segundos, mate el proceso y luego rompa el bucle. Sin embargo, el problema es que si el proceso ya está en ejecución y solo se ejecutan los contenidos del bucle, el proceso se mata después de 60 segundos como se espera. Pero cuando se ejecuta todo el script, nunca se mata el proceso una vez que comienza a ejecutarse.

    El script comienza iniciando el proceso “Barcode2COM.exe”. El bucle for se ejecuta un máximo de $max_iterations veces, siendo $max_iterations no definido explícitamente en el código. Dentro del bucle, el script recupera un objeto de proceso con el mismo nombre que “BCR_MODE_SET”.

    El cmdlet Wait-Process se utiliza para esperar a que el proceso finalice la ejecución durante un máximo de 60 segundos, mientras que la variable $timeouted se reinicia. Si el proceso termina normalmente dentro de 60 segundos, el script continúa con la siguiente iteración del bucle for. Sin embargo, si el cmdlet Wait-Process agota el tiempo, lo que significa que el proceso no logra finalizar la ejecución dentro de 60 segundos, se establece $timeouted como $true.

    Para manejar el evento de tiempo agotado, se utiliza una declaración if-else para verificar si $timeouted ha sido establecido. Si $timeouted es true, el script termina el proceso utilizando el método Kill. Si $timeouted es false, el script continúa con la siguiente iteración del bucle for.

    Sin embargo, no hay ninguna otra condición que defina qué debería ocurrir si elif ($proc.ExitCode -ne 0) es true. El ExitCode es una propiedad del objeto de proceso que se puede utilizar para identificar los códigos de error que se devuelven cuando un proceso termina.

    El problema con el script probablemente se debe a que el tiempo del bucle es corto; es posible que desee agregar un método de pausa (sleep) al bucle para darle suficiente tiempo al proceso para ejecutarse antes de comenzar a buscarlo.

Comments are closed.