Limite de temps de la ligne de commande Windows

9

Comment pourrais-je limiter le temps d'exécution d'un programme de ligne de commande dans Windows? Je sais que sous Linux, il y a timeout / timelimit disponible, mais je n'ai pas pu trouver des utilitaires similaires pour Windows.

ayu
la source
Il est probablement préférable d'écrire un script Powershell ou Python pour ce faire.
Percée du

Réponses:

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

Si vous mettez cela dans le bloc-notes et enregistrez-le car .batil créera un fichier de commandes qui le fera.

J'ai utilisé 10 secondes à titre d'exemple, ajustez simplement vos besoins.

De plus, si vous utilisez Vista ou supérieur, vous pouvez supprimer la pingligne et utiliser la timeoutcommande beaucoup plus facile à sa place

timeout /t 10
Bali C
la source
1
Comment cela gérerait-il les arguments et les multiples instances de votre programme? Ce serait bien si le début renvoyait un PID, mais pas de chance ...
Vous pouvez passer des arguments avec start yourprogram.exe yourarguments. Oui, il aurait taskkillune option pour tuer par PID, mais vous devriez l'extraire du tasklistpremier en fonction du nom, qui est de retour à la case départ si vous avez plusieurs instances. Ce n'est qu'une limitation de cmd.
Bali C
1
+1 Utiliser ping comme minuterie de temporisation est une idée amusante :)
kol
Ajoutez > NULà la pingcommande pour écraser sa sortie.
starbeamrainbowlabs
4

Comme je sais qu'il ne semble pas qu'une telle fonction existe, mais je pense que c'est faisable si vous la faites fonctionner comme une tâche Windows via le Planificateur de tâches, à partir de là, vous pouvez définir une limitation d'exécution, le paramètre nommé: Arrêtez la tâche si elle s'exécute plus long que:, vous pouvez obtenir plus de détails ici: http://technet.microsoft.com/en-us/library/cc722178.aspx

Simon Wang
la source
3

Si vous pouvez être dérangé par l'utilisation de PowerShell: $app = Start-Process -PassThru -FilePath 'notepad' -ArgumentList 'test.txt'démarrera le bloc-notes avec un argument test.txt (vous pouvez séparer plusieurs arguments par ,.

Start-Sleep -Seconds 10 dormira pendant 10s.

Soit $app.Kill()ou taskkill /PID $app.Idtuera l'application démarrée.

Si vous préférez une solution cmd qui appellera uniquement PowerShell pour démarrer le processus, puis stockera son PID dans une variable: for /F %A in ('powershell -Command "(Start-Process -PassThru -FilePath 'notepad' -ArgumentList 'test.txt').Id"') do set PID=%A(lorsqu'elle est appelée à partir d'un .bat / .cmd, vous devez utiliser à la %%Aplace de %A). Vous pouvez ensuite utiliser les méthodes de @ BaliC pour expirer et taskkill /PID %PID%tuer l'application démarrée.

mprill
la source
1

Solution :

Dans Windows, il doit créer trois fichiers batch

process.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

Maintenant, exécutez process.bat. il démarrera simultanément cm.bat et run.bat simultanément / parallèlement. Lorsque a.exe de cm.bat se termine; cm.bat tue run.bat et il fonctionnera donc comme un timeout ubuntu.

Shawon
la source