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)
{
}
}
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.