Límite de tiempo de la línea de comandos de Windows

9

¿Cómo podría limitar el tiempo de ejecución de un programa de línea de comandos en Windows? Sé que en Linux hay tiempo de espera / límite de tiempo disponible, pero no he podido encontrar utilidades similares para Windows.

ayu
fuente
Probablemente sea mejor escribir un script Powershell o Python para hacer esto.
Avance el

Respuestas:

9
start yourprogram.exe
ping 127.0.0.1 -n 10
taskkill /im yourprogram.exe

Si coloca esto en el bloc de notas y lo guarda .bat, creará un archivo por lotes que lo hará.

He usado 10 segundos como ejemplo, solo ajusta tus necesidades.

Además, si está utilizando Vista o superior, puede eliminar la pinglínea y usar el timeoutcomando mucho más fácil en su lugar

timeout /t 10
Bali C
fuente
1
¿Cómo manejaría esto los argumentos y las múltiples instancias de su programa? Sería bueno si start devolviera un PID, pero no tuve tanta suerte ...
Puedes pasar argumentos con start yourprogram.exe yourarguments. Sí, tendría taskkilluna opción para matar por PID, pero tendrías que extraerlo desde el tasklistprincipio según el nombre, que está de vuelta en el cuadrado uno si tienes varias instancias. Esto es solo una limitación de cmd.
Bali C
1
+1 Usar ping como temporizador de tiempo de espera es una idea divertida :)
kol
Añadir > NULal pingcomando para aplastar su salida.
starbeamrainbowlabs
4

Como sé, parece que no existe tal función, pero creo que es factible si la ejecuta como una tarea de Windows a través del Programador de tareas, desde allí puede establecer una limitación de ejecución, la configuración denominada como: Detenga la tarea si se ejecuta más largo que: puede obtener más detalles aquí: http://technet.microsoft.com/en-us/library/cc722178.aspx

Simon Wang
fuente
3

Si puede molestarse con el uso de PowerShell: $app = Start-Process -PassThru -FilePath 'notepad' -ArgumentList 'test.txt'iniciará el bloc de notas con un argumento de test.txt (puede separar varios argumentos por ,.

Start-Sleep -Seconds 10 dormirá por 10s.

O matará $app.Kill()o taskkill /PID $app.Ideliminará la aplicación iniciada.

Si prefiere una solución cmd que solo llame a PowerShell para iniciar el proceso y luego almacene su PID en una variable: for /F %A in ('powershell -Command "(Start-Process -PassThru -FilePath 'notepad' -ArgumentList 'test.txt').Id"') do set PID=%A(cuando se llama desde un .bat / .cmd, debe usarlo en %%Alugar de %A). Luego puede usar los métodos de @ BaliC para agotar el tiempo de espera y taskkill /PID %PID%eliminar la aplicación iniciada.

mprill
fuente
1

Solución:

En Windows necesita hacer tres archivos por lotes.

proceso.bat

@ECHO OFF
start   /b cm.bat
start  cmd.exe /c run.bat
EXIT

cm.bat

@ECHO OFF
a.exe < input.txt > out.txt
taskkill /im a.exe /f
taskkill /im cmd.exe /f
EXIT

run.bat

@ECHO off
timeout /t 5
taskkill /im a.exe /f 
taskkill /im cmd.exe /f

EXIT

Ahora ejecute process.bat. iniciará cm.bat y run.bat simultáneamente / paralelamente. Cuando a.exe de cm.bat termina; cm.bat mata run.bat y, por lo tanto, funcionará como tiempo de espera de ubuntu.

Shawon
fuente