In einer batch-Datei einen Befehl mit timeout aufrufen?
Hallo,
gibts eine Möglichkeit, einen beliebigen Befehl mit einem timeout zu starten? Also, wenn der Befehl z.B. nach 10 Sekunden nicht fertig ist, dann soll er abgebrochen werden.
Ganz einfaches Beispiel:
echo Anfang
dir c:\
echo Ende
Wenn der dir-Befehl, aus welchem Grund auch immer, hängen bleibt, wird die batch nie beendet werden, deshalb würde ich ihn gerne so starten, daß er nach 10 Sekunden aufgibt und die batch weiter abgearbeitet wird.
Gibt´s sowas?
Danke
Martin
gibts eine Möglichkeit, einen beliebigen Befehl mit einem timeout zu starten? Also, wenn der Befehl z.B. nach 10 Sekunden nicht fertig ist, dann soll er abgebrochen werden.
Ganz einfaches Beispiel:
echo Anfang
dir c:\
echo Ende
Wenn der dir-Befehl, aus welchem Grund auch immer, hängen bleibt, wird die batch nie beendet werden, deshalb würde ich ihn gerne so starten, daß er nach 10 Sekunden aufgibt und die batch weiter abgearbeitet wird.
Gibt´s sowas?
Danke
Martin
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 231487
Url: https://administrator.de/forum/in-einer-batch-datei-einen-befehl-mit-timeout-aufrufen-231487.html
Ausgedruckt am: 22.04.2025 um 22:04 Uhr
4 Kommentare
Neuester Kommentar
Hallo Martin,
man kann so etwas von einem parallel aufgerufenen Prozess aus machen. Wie genau, richtet sich aber danach, was genau dabei überwacht werden soll. Sollte es sich bei dem Befehl um ein eigenständiges Programm handeln, wird über TASKLIST relativ einfach festzustellen sein, ob das Programm nach 10s noch läuft. Für CMD-interne Befehle (wie DIR) wird das etwas komplizierter und man müsste ein Workaround bauen, das sich nicht mit deinen Ansprüchen beißt.
Gib einfach mal ein paar Informationen mehr, bzw. erzähl am besten um was es dir konkret geht.
Grüße
rubberman
man kann so etwas von einem parallel aufgerufenen Prozess aus machen. Wie genau, richtet sich aber danach, was genau dabei überwacht werden soll. Sollte es sich bei dem Befehl um ein eigenständiges Programm handeln, wird über TASKLIST relativ einfach festzustellen sein, ob das Programm nach 10s noch läuft. Für CMD-interne Befehle (wie DIR) wird das etwas komplizierter und man müsste ein Workaround bauen, das sich nicht mit deinen Ansprüchen beißt.
Gib einfach mal ein paar Informationen mehr, bzw. erzähl am besten um was es dir konkret geht.
Grüße
rubberman
Hallo Martin
OK, etwas allgemeingültig, nämlich für separate Programme mit einem eindeutigen Teil in der Kommandozeile des Programms, könnte wie folgt aussehen:
killtimeout.bat
worker.bat
Beide Batchdateien liegen im gleichen Verzeichnis.
"worker.bat" wird per Doppelklick gestartet.
Von dort wird zunächst "killtimeout.bat" asynchron mit 2 Parametern gestartet. Der erste Parameter ist der Prozessname des zu überwachenden Programms (hier notepad.exe, stellvertretend für psinfo.exe bei dir). Der zweite Parameter ist ein eindeutiger Teil der Kommandozeile des Programms (hier ist es das Wort "killtimeout", stellvertretend für den PC Name bei dir).
Danach wird notepad.exe mit dem Parameter killtimeout.bat aufgerufen. Zum Verständnis: Das Wort "killtimeout" ist somit Teil der Kommandozeile des Aufrufs von Notepad. (Bei dir wäre es dann PsInfo.exe, wobei der Computername Teil der Kommandozeile wäre.)
Was passiert in der "killtimeout.bat"?
Ist also nicht besonders kompliziert, oder? Ob es nun elegant ist, liegt im Auge des Betrachters
Grüße
rubberman
OK, etwas allgemeingültig, nämlich für separate Programme mit einem eindeutigen Teil in der Kommandozeile des Programms, könnte wie folgt aussehen:
killtimeout.bat
@echo off &setlocal
set "ProcName=%~1"
set "CmdLnPart=%~2"
set "processid="
>nul timeout /t 10 /nobreak
for /f %%i in (
'2^>nul wmic process where "name='%ProcName%' and commandline like '%%%CmdLnPart%%%'" get processid /value'
) do for /f %%j in ("%%i") do set "%%j"
if defined processid >nul 2>&1 taskkill /f /pid %processid%
worker.bat
@echo off &setlocal
start "" /b "cmd.exe" /c ""%~dp0killtimeout.bat" "notepad.exe" "killtimeout""
notepad.exe killtimeout.bat
pause
Beide Batchdateien liegen im gleichen Verzeichnis.
"worker.bat" wird per Doppelklick gestartet.
Von dort wird zunächst "killtimeout.bat" asynchron mit 2 Parametern gestartet. Der erste Parameter ist der Prozessname des zu überwachenden Programms (hier notepad.exe, stellvertretend für psinfo.exe bei dir). Der zweite Parameter ist ein eindeutiger Teil der Kommandozeile des Programms (hier ist es das Wort "killtimeout", stellvertretend für den PC Name bei dir).
Danach wird notepad.exe mit dem Parameter killtimeout.bat aufgerufen. Zum Verständnis: Das Wort "killtimeout" ist somit Teil der Kommandozeile des Aufrufs von Notepad. (Bei dir wäre es dann PsInfo.exe, wobei der Computername Teil der Kommandozeile wäre.)
Was passiert in der "killtimeout.bat"?
- 10 s warten
- WMIC prüft, ob ein Prozess mit dem entsprechenden Name und dem angegebenen Teil der Kommandozeile existiert und gibt die Prozess ID aus.
- Sollte eine PID ermittelt worden sein, wird der Prozess per TASKKILL beendet.
Ist also nicht besonders kompliziert, oder? Ob es nun elegant ist, liegt im Auge des Betrachters
Grüße
rubberman