Wie kann ich ein Zeitlimit für eine Batch-Datei festlegen?

2

Ich habe eine Batch-Datei, die ein externes Programm aufruft, das regelmäßig hängt. Ich möchte ein Zeitlimit für die Batchdatei / CMD-Eingabeaufforderung festlegen, sodass sie nach einer bestimmten Zeit automatisch geschlossen wird. Ein Haken ist, dass in dem externen Programm, das hängt, möglicherweise eine oder mehrere Instanzen zu einem bestimmten Zeitpunkt ausgeführt werden, und ich möchte nur, dass die Batchdatei, die ihr Zeitlimit erreicht, die durch den Batch ausgelöste Instanz des Programms schließt. Wie kann ich das erreichen? Idealerweise funktioniert eine Lösung unter Windows XP, Vista und 7.

russellpierce
quelle

Antworten:

1
REM start the program as quickly as possible to avoid other processes starting
tasklist > file1.txt & start notepad.exe & tasklist > file2.txt
REM Find the PID of the program we just started
for /f "tokens=2" %%a in ('fc file1.txt file2.txt^|find "notepad.exe"') do set PID=%%a
REM delay for 5 seconds
FOR /l %%a in (5,-1,1) do (Echo closing in %%as&ping -n 2 -w 1 127.0.0.1>NUL)
REM delete the program using it's PID
tskill %PID%

Die ping -n 2 -w 1 127.0.0.1Pause dauert fast genau 1 Sekunde (die Zeitspanne zwischen zwei Pings).
Dies funktioniert unter XP, da dies choicenicht in XP enthalten ist

SeanC
quelle
-1

Schreiben Sie diesen Stapel:

@echo off    
choice /t <waiting time in seconds> /d y
taskkill /im <process name> /f /fi "status eq not responding"

Fügen Sie dies bei Bedarf in eine Schleife ein.

tumchaaditya
quelle
Dies unterscheidet nicht die von der Batch-Datei gestartete Instanz. Und der Status, der nicht reagiert, funktioniert möglicherweise nur für GUI-Programme.
Joey
Touché über die Instanz .. Der Status würde für alles funktionieren .. Es ist im Grunde der Status, den Sie im Task-Manager sehen .... Wenn dieser Status "läuft" und das Programm immer noch hängt, bezweifle ich, dass es eine Möglichkeit gibt, den Hang zu erkennen. ..
Tumchaaditya
Nun, der nicht antwortende wird vom Fenstermanager erkannt, wenn ein Programm keine Ereignisse in seiner Nachrichtenwarteschlange verarbeiten kann. Aber das erfordert ein Fenster und ich habe noch nie gesehen, dass Konsolenprogramme auf diese Weise "hängen". Vermutlich, weil der Konsolenhost-Prozess nie hängt und das darin ausgeführte Programm nie direkt mit der WM kommuniziert.
Joey
In diesem Fall wird der Prozess nach wie vor vom Task-Manager "ausgeführt", es ist jedoch eine Netzwerk-Zeitüberschreitung aufgetreten, und er sitzt nur dort und wartet darauf, dass der Benutzer dies sieht und sich damit befasst. In diesem Fall, da ich nicht möchte, dass der Benutzer dies sieht / damit umgeht, kann ich den Vorgang nur alle paar Stunden wahllos beenden (er stellt sich ordnungsgemäß wieder her). Wie Joey betonte, werden alle Prozesse mit demselben Namen und nicht der, den ich gerade gestartet habe, beendet. Ich sehe, dass Taskkill eine Option hat, um durch PID zu töten, aber ich weiß nicht, wie ich die PID einer Instanz abrufen kann, wenn ich sie starte.
Russellpierce