Wie kann ich die ProzessID, eines laufenden Programms, in einer einzeiligen FOR Schleife herausfinden?
Es geht darum ein Watchdog loop script für ein Script/Programm (CMD.exe, programm_xyz.exe) zu realisieren. Das Haupt-Script startet ein weiteres "watchdog" script was die Laufzeit des Hauptscriptes überwachen soll.
Mir geht es nur darum, eine Loop zu realisieren die in einer FOR - Schleife nach der ProzessID eines Programms sucht (z.B.: einer ping.exe [localhost -t] die irgendwann gestartet wurde), diese ausgibt und ggf. das Hauptprogramm nach Zeit X "killt"
Wie findet man in der Haupt-Batch die ProzessID eines per "start /B anderes_script.cmd" gestarteten scriptes heraus, um diese uberwachen zu können.
Gibt es eine Möglichkeit, das schließen des CMD.exe Fensters (via X am rechten oberen Fensterrand) abzufangen und ein "panik" script auszuführen, was ein geordetes beenden ermöglichen würde, ein "watchdog" fürs Haupt-script sozusagen
Meine Idee wäre so eine FOR Schleife, allerdings scheint das nicht so zu klappen, wie ich das gerne hätte. Außerhalb der FOR - Schleife funktioniert mein Anssatz, was kann ich da tun bzw. wo ist mein Fehler.
matze
- Punkt 1
Mir geht es nur darum, eine Loop zu realisieren die in einer FOR - Schleife nach der ProzessID eines Programms sucht (z.B.: einer ping.exe [localhost -t] die irgendwann gestartet wurde), diese ausgibt und ggf. das Hauptprogramm nach Zeit X "killt"
- Punkt 2
Wie findet man in der Haupt-Batch die ProzessID eines per "start /B anderes_script.cmd" gestarteten scriptes heraus, um diese uberwachen zu können.
- Punkt 3
Gibt es eine Möglichkeit, das schließen des CMD.exe Fensters (via X am rechten oberen Fensterrand) abzufangen und ein "panik" script auszuführen, was ein geordetes beenden ermöglichen würde, ein "watchdog" fürs Haupt-script sozusagen
Meine Idee wäre so eine FOR Schleife, allerdings scheint das nicht so zu klappen, wie ich das gerne hätte. Außerhalb der FOR - Schleife funktioniert mein Anssatz, was kann ich da tun bzw. wo ist mein Fehler.
for /f "tokens=3 delims=," %i in ('wmic process get processid,executablepath /format:csv^|findstr /I "ping.exe"') do ( echo %i )
matze
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 147997
Url: https://administrator.de/forum/wie-kann-ich-die-prozessid-eines-laufenden-programms-in-einer-einzeiligen-for-schleife-herausfinden-147997.html
Ausgedruckt am: 09.04.2025 um 14:04 Uhr
13 Kommentare
Neuester Kommentar
Hallo mhuelse.
Punkt 1 sollte mit tasklist machbar sein
Punkt 3 IMO unmöglich
Punkt 2 vielleicht mit WIMIC, such mal im msdn. Mir fällt da auf Anhieb aber nichts ein.
[Edit: Oder du gibst dem Kind einen Namen (Fenstertitel), dann geht's auch per tasklist. /]
Grüße
rubberman
Punkt 1 sollte mit tasklist machbar sein
for /f "delims=, tokens=2" %%a in ('tasklist /fi "imagename eq ping.exe" /fo "csv" /nh') do echo %%~a
Punkt 3 IMO unmöglich
Punkt 2 vielleicht mit WIMIC, such mal im msdn. Mir fällt da auf Anhieb aber nichts ein.
[Edit: Oder du gibst dem Kind einen Namen (Fenstertitel), dann geht's auch per tasklist. /]
Grüße
rubberman

Hallo rubberman,
Hier mal eine Demo:
Gruß
LotPings
Punkt 3 IMO unmöglich
In der Form schwierig (wenn auch nicht unmöglich) aber mit einem Tool wie CMDOW könnte man die zu schützende CMD mit /HID verstecken, dann kann auch niemand irgendwo drauf klicken.Hier mal eine Demo:
@echo off & SetLocal & CLS
Set "MSG=Achtung"
If "%1" EQU "DispWarn" Goto :DispWarn
set Delay=10
Echo Batch gestartet,
Echo.
Echo Dieses CMD Fenster verschwindet nach drücken einer beliebigen Taste für %Delay% Sekunden
pause >NUL
:: Startet diese Batchdatei nochmal in sep. Fenster zur Anzeige einer Warnung
Start "%MSG%" cmd.exe /k "%~f0" DispWarn
:: Verstecke mich
cmdow @ /HID
:: warten
ping -n %Delay% localhost >NUL 2>&1
:: komm wieder raus.
cmdow @ /VIS
:: Beende jetzt überflüssigen warnhinweis
cmdow %MSG% /END
Echo bin wieder da
pause
Goto :Eof
:DispWarn
mode con: cols=50 lines=10
color e1
Title %MSG%
cls
:: setze mich on Top
cmdow @ /TOP
Echo.Hier sollte dein Hinweis hin
Echo.
Echo.Laber bla blubb
Echo.Laber bla blubb
:Setze ein paar Punkte zur Simulation es täte sich etwas
For /L %%l in (1,1,49) do ping -n 2 localhost >NUL & set /P _="."<NUL
Echo.
goto :Setze
Gruß
LotPings
Hi mhuelse,
Mein Fehler - da war ich wohl zu voreilig. executablepath kannste auch weglassen ist eh immer "Pfad der cmd.exe"
gibt ja nur die Zeile(n) von Batches aus, welche noch aktiv sind aber nur mit der Befehlszeile: "Pfad\Batch.cmd" im CMD-Fenster oder Ausführen-Dialog bzw. Doppelklick darauf gestartet worden sind.
in diesem Beispiel
Startparameter commandline , PID
gibt die Zeile(n) aus, welche mit "start /b "Pfad\Batch.cmd" im CMD-Fenster oder Batches gestartet wurden
solange dieses CMD-Fenster noch aktiv ist wird die Zeile ausgegeben auch wenn in diesem CMD-Fenster mit EXIT quittiert wird und das Fenster offen ist
Beispielausgabe:
PS. das erste token von der Wmic ausgabe ist mit Formatangabe entsprechend %Userdomain%, deswegen hatte ich es gleich weggelassen.
Gruß Phil
Mein Fehler - da war ich wohl zu voreilig. executablepath kannste auch weglassen ist eh immer "Pfad der cmd.exe"
for /f "tokens=2* delims=," %i in ('"wmic process get processid,commandline /format:csv"') do echo "%i,%j" |findstr /c:"\"cmd /"
in diesem Beispiel
Startparameter commandline , PID
"cmd /c ""E:\AdminHelp\test123.cmd" ",316"
for /f "tokens=2* delims=," %i in ('"wmic process get processid,commandline /format:csv"') do @echo "%i,%j"|findstr /c:"cmd.exe /K"
solange dieses CMD-Fenster noch aktiv ist wird die Zeile ausgegeben auch wenn in diesem CMD-Fenster mit EXIT quittiert wird und das Fenster offen ist
Beispielausgabe:
"C:\Windows\system32\cmd.exe /K E:\AdminHelp\test123.cmd,2456"
PS. das erste token von der Wmic ausgabe ist mit Formatangabe entsprechend %Userdomain%, deswegen hatte ich es gleich weggelassen.
Gruß Phil
@77559
Joa, das wird den User nicht abhalten das Ding im Taskmanager zu killen.
BTW Ähnliches (disable / enable Closebutton) hab ich als Toolchen selbst schon in C++ geschrieben. Hilft natürlich ebensowenig.
Letztlich bleibt vermutlich also nur von außen zu überwachen, ob der Task noch läuft. Vermutlich wird es dann aber schon zu spät sein...
Grüße
rubberman
Joa, das wird den User nicht abhalten das Ding im Taskmanager zu killen.
BTW Ähnliches (disable / enable Closebutton) hab ich als Toolchen selbst schon in C++ geschrieben. Hilft natürlich ebensowenig.
Letztlich bleibt vermutlich also nur von außen zu überwachen, ob der Task noch läuft. Vermutlich wird es dann aber schon zu spät sein...
Grüße
rubberman
Letztlich bleibt vermutlich also nur von außen zu überwachen, ob der Task noch läuft. Vermutlich wird es dann aber schon zu spät sein...
und wenn sich ständig etwas selbst penedrant startet und um's Verreck.. nicht schließen lässt, dann haben wir schon fast so etwas wie einen Virus/Wurm etc.
Mein Tipp:
Wenn du, mhuelse, der Admin bist, dann sperre bei den usern einfach den Zugriff auf den Taskmanager und lasse dein Script hidden ausführen und du musst dir um Punkt 3 wenig Gedanken machen.
Gruss
tsuki
Moin,
das zweite ausgegebene Token ist doch die PID
das wäre dann so
als verschachtelte For-Schleife eventuell so
Gruß Phil
das zweite ausgegebene Token ist doch die PID
das wäre dann so
for /f "tokens=2* delims=," %i in ('"wmic process get processid,commandline /format:csv"') do (@echo "%i"|findstr /c:"cmd.exe /K">nul&& set "PID=%j")
als verschachtelte For-Schleife eventuell so
for /f "tokens=2* delims=," %i in ('"wmic process get processid,commandline /format:csv"') do (@echo "%i"|findstr /c:"cmd.exe /K">nul&&(echo PID j%& taskkill /PID %j))
Gruß Phil
Hi Mathias,
Wenn Du KommentarZeilen innerhalb von Klammern Verwenden möchtest dann Nicht als Letzte Zeile innerhalb dieser Klammer!
Achte bei einer AusKommentierten Klammer darauf dass die Zeile nach dem Kommentar einen Befehl enthält (zumindest ein REM)
führe Diese im CMD-Fenster aus
Warum suchst Du erst viermal nach der PID von ping.exe - setzt nur die zuletzt gefunde PID als Variable und Killst den Prozess erst am Ende?
Gruß Phil
Wenn Du KommentarZeilen innerhalb von Klammern Verwenden möchtest dann Nicht als Letzte Zeile innerhalb dieser Klammer!
Achte bei einer AusKommentierten Klammer darauf dass die Zeile nach dem Kommentar einen Befehl enthält (zumindest ein REM)
führe Diese im CMD-Fenster aus
echo 1. Test mit REM innerhalb einer Klammer
(echo 1.1
echo 1.2
echo 1.3
Rem
)
echo 2. Test mit Kommentar-Zeilen vor BefehlsZeilen innerhalb einer Klammer
(::Kommentar vor dem 1.Befehl in der IF-Klammer
echo 2.1
::Kommentar vor dem 2.Befehl in der IF-Klammer
echo 2.2
::Kommentar vor dem 3.Befehl in der IF-Klammer
echo 2.3
::Kommentar vor dem 4.Befehl in der IF-Klammer
Rem
)
echo 3. Test mit Kommentar-Zeilen als Letzte Zeile innerhalb einer Klammer - geht NICHT
(echo 2.1
echo 2.2
echo 2.3
REM
::Kommentar als Letzte Zeile in der IF-Klammer fasst in die Grütze
)
Warum suchst Du erst viermal nach der PID von ping.exe - setzt nur die zuletzt gefunde PID als Variable und Killst den Prozess erst am Ende?
Gruß Phil