Windows-Befehlszeilenzeitlimit

9

Wie kann ich die Ausführungszeit eines Befehlszeilenprogramms in Windows begrenzen? Ich weiß, dass unter Linux Timeout / Timelimit verfügbar ist, aber ich konnte keine ähnlichen Dienstprogramme für Windows finden.

Ayu
quelle
Es ist wahrscheinlich am besten, ein Powershell- oder Python-Skript zu schreiben, um dies zu tun.
Durchbruch

Antworten:

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

Wenn Sie dies in den Editor einfügen und speichern, .batwird eine Batchdatei erstellt, die dies ausführt.

Ich habe 10 Sekunden als Beispiel verwendet, nur um Ihre Bedürfnisse zu optimieren.

Wenn Sie Vista oder höher verwenden, können Sie die pingZeile verschrotten und stattdessen den viel einfacheren timeoutBefehl verwenden

timeout /t 10
Bali C.
quelle
1
Wie würde dies mit Argumenten und mehreren Instanzen Ihres Programms umgehen? Es wäre schön, wenn der Start eine PID zurückgeben würde, aber kein solches Glück ...
Sie können Argumente mit übergeben start yourprogram.exe yourarguments. Ja, es würde taskkilleine Option zum Töten durch PID geben, aber Sie müssten es tasklistzuerst anhand des Namens extrahieren , der bei mehreren Instanzen wieder auf dem ersten Platz steht. Dies ist nur eine Einschränkung von cmd.
Bali C
1
1 Mit ping als timout Timer ist eine lustige Idee :)
kol
Fügen Sie > NULden pingBefehl hinzu, um die Ausgabe zu quetschen.
Starbeamrainbowlabs
4

Wie ich weiß, scheint es keine solche Funktion zu geben, aber ich denke, es ist machbar, wenn Sie sie als Windows-Task über den Taskplaner ausführen. Von dort aus können Sie eine Ausführungsbeschränkung festlegen, die folgende Einstellung hat: Stoppen Sie die Task, wenn sie ausgeführt wird länger als: können Sie hier weitere Details abrufen : http://technet.microsoft.com/en-us/library/cc722178.aspx

Simon Wang
quelle
3

Wenn Sie $app = Start-Process -PassThru -FilePath 'notepad' -ArgumentList 'test.txt'Probleme mit der Verwendung von PowerShell haben: Startet den Editor mit dem Argument test.txt (Sie können mehrere Argumente durch trennen ,.

Start-Sleep -Seconds 10 wird für 10s schlafen.

Entweder $app.Kill()oder taskkill /PID $app.Idwird die gestartete Anwendung beenden.

Wenn Sie eine cmd-Lösung bevorzugen, die nur PowerShell aufruft, um den Prozess zu starten und dann die PID in einer Variablen zu speichern: for /F %A in ('powershell -Command "(Start-Process -PassThru -FilePath 'notepad' -ArgumentList 'test.txt').Id"') do set PID=%A(Wenn Sie von einer .bat / .cmd aufgerufen werden, müssen Sie %%Astattdessen verwenden %A). Sie können dann die Methoden von @ BaliC verwenden taskkill /PID %PID%, um das Zeitlimit zu überschreiten und die gestartete Anwendung zu beenden .

mprill
quelle
1

Lösung:

In Windows müssen drei Batch-Dateien erstellt werden

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

Führen Sie nun process.bat aus. Es startet sowohl cm.bat als auch run.bat gleichzeitig / parallel. Wenn a.exe von cm.bat endet; cm.bat beendet run.bat und funktioniert somit als Ubuntu-Timeout.

Shawon
quelle