Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Wie kann ich die ProzessID, eines laufenden Programms, in einer einzeiligen FOR Schleife herausfinden?

Frage Entwicklung Batch & Shell

Mitglied: mhuelse

mhuelse (Level 1) - Jetzt verbinden

30.07.2010, aktualisiert 10.08.2010, 4206 Aufrufe, 13 Kommentare

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.

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.

01.
for /f "tokens=3 delims=," %i in ('wmic process get processid,executablepath /format:csv^|findstr /I "ping.exe"') do ( echo  %i )

matze
Mitglied: rubberman
30.07.2010 um 12:57 Uhr
Hallo mhuelse.

Punkt 1 sollte mit tasklist machbar sein
01.
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
Bitte warten ..
Mitglied: mhuelse
30.07.2010 um 13:33 Uhr
Viele Dank!

das ist auch mein erster Gedanke gewesen, das mit tasklist zu machen, nur ist da das Problem, dass ich das nicht an einem Verzeichnis festmachen kann, wie mit "wmic process get processid,executablepath /format:csv"
Ich gebe zu, man hätte das am Anfang mit erwähnen sollen.

Matze
Bitte warten ..
Mitglied: LotPings
30.07.2010 um 14:29 Uhr
Hallo rubberman,
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:
01.
@echo off & SetLocal & CLS 
02.
Set "MSG=Achtung" 
03.
If "%1" EQU "DispWarn" Goto :DispWarn 
04.
set Delay=10 
05.
 
06.
Echo Batch gestartet,  
07.
Echo. 
08.
Echo Dieses CMD Fenster verschwindet nach drücken einer beliebigen Taste für %Delay% Sekunden 
09.
pause >NUL 
10.
:: Startet diese Batchdatei nochmal in sep. Fenster zur Anzeige einer Warnung 
11.
Start "%MSG%" cmd.exe /k "%~f0" DispWarn 
12.
 
13.
:: Verstecke mich 
14.
cmdow @ /HID 
15.
:: warten 
16.
ping -n %Delay% localhost >NUL 2>&1 
17.
:: komm wieder raus. 
18.
cmdow @ /VIS 
19.
:: Beende jetzt überflüssigen warnhinweis 
20.
cmdow %MSG% /END 
21.
Echo bin wieder da 
22.
 
23.
pause 
24.
 
25.
Goto :Eof 
26.
 
27.
:DispWarn 
28.
mode con: cols=50 lines=10 
29.
color e1 
30.
Title %MSG% 
31.
cls 
32.
:: setze mich on Top 
33.
cmdow @ /TOP 
34.
Echo.Hier sollte dein Hinweis hin 
35.
Echo. 
36.
Echo.Laber bla blubb 
37.
Echo.Laber bla blubb 
38.
:Setze ein paar Punkte zur Simulation es täte sich etwas 
39.
For /L %%l in (1,1,49) do ping -n 2 localhost >NUL & set /P _="."<NUL 
40.
Echo. 
41.
goto :Setze
Gruß
LotPings
Bitte warten ..
Mitglied: pieh-ejdsch
30.07.2010 um 14:40 Uhr
Hi mhuelse,

zu Punkt 2 wäre die Zeile vllt so abänderbar

01.
C:\Users\Pieh-Ejdsch>for /f "tokens=2* delims=," %i in ('"wmic process get processid,executablepath,commandline /format:csv"  ') do @echo "%i,%j" |findstr /c:"\"cmd /"
Gruß Phil
Bitte warten ..
Mitglied: mhuelse
30.07.2010 um 15:46 Uhr
Hi,

Leider kann ich dein Codeschnippsel nicht ganz nachvollziehen, helft mir mal, dass zu verstehen. Ich hab's einfach mal mit einem Test probiert, werde aber eben nicht ganz schlau daraus...

01.
 
02.
echo ping localhost -n 30>test.cmd 
03.
echo ENDE!>>test.cmd 
04.
 
05.
start /b test.cmd 
06.
 
07.
 
08.
for /f "tokens=2* delims=," %%i in ('"wmic process get processid,executablepath,commandline /format:csv"  ') do echo "%%i,%%j" |findstr /c:"\"cmd /"
Bitte warten ..
Mitglied: pieh-ejdsch
31.07.2010 um 00:29 Uhr
Hi mhuelse,

Mein Fehler - da war ich wohl zu voreilig. executablepath kannste auch weglassen ist eh immer "Pfad der cmd.exe"
01.
for /f "tokens=2* delims=," %i in ('"wmic process get processid,commandline /format:csv"') do echo "%i,%j" |findstr /c:"\"cmd /"
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
"cmd /c ""E:\AdminHelp\test123.cmd" ",316"
01.
for /f "tokens=2* delims=," %i in ('"wmic process get processid,commandline /format:csv"') do @echo "%i,%j"|findstr /c:"cmd.exe  /K"
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:
"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
Bitte warten ..
Mitglied: rubberman
31.07.2010 um 02:07 Uhr
@LotPings

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
Bitte warten ..
Mitglied: TsukiSan
31.07.2010 um 02:18 Uhr
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
Bitte warten ..
Mitglied: mhuelse
02.08.2010 um 08:44 Uhr
Ich bin zwar der Support-Admin auf diesem System, aber leider nicht der einzigste, und erschwerend kommt hinzu, das die auch noch überall in Deutschland verteilt sitzen. Ansonsten ist es schon richtig, dass man damit nicht "nette Sachen" veranstalten könnte. Es ging ja auch nicht drum das "versteckt" zu machen, sondern einfach nur darum ein "definiertes" beenden des mittlerweile sehr komplexen multiuser - Hauptscripts zu erreichen. Dafür schien mir so eine Art "Interaktiver - watchdog" ganz geeignet zu sein.
Auf dem TS System den Taskmanager zu deaktivieren ist eine schlechte Idee, da dort ständig irgendwelche Java Prozesse hängenbleiben bzw. von den Benutzern nicht richtig beendet wurden bzw. durch Kommunikations -problemchen rausfliegen.

@ Phil

wie bekomme ich das hin, dass mir in einem Einzeiler nur die PID in einer Variable landet, sozusagen Punkt 1 und Punkt 2 in einem zu lösen. Eine verschachtelte FOR-Schleife hab ich bis jetzt noch nicht so hinbekommen.


Vielen Dank
Mathias
Bitte warten ..
Mitglied: pieh-ejdsch
02.08.2010 um 09:08 Uhr
Moin,

das zweite ausgegebene Token ist doch die PID
das wäre dann so
01.
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

01.
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
Bitte warten ..
Mitglied: mhuelse
02.08.2010 um 13:26 Uhr
Vielen Dank Phil!

Da ich kein Hauptamtlicher Admin bin und eigentlich anderes auf dem Radar habe, muss ich mir immer mal Zeit nehmen dieses "script" zu pflegen / optimieren, sodass ich zeitlang nur Gedanklich an dem script arbeite. Darum auch die eventuell "simplen" Fragen....

Grüße
Mathias
Bitte warten ..
Mitglied: mhuelse
10.08.2010 um 15:43 Uhr
Habe da noch eine Frage dazu, da mein gedankliches Konstrukt, was ich heute mal in "real" testen wollte nicht so recht will.

01.
:: 
02.
:: Testweise einen PING ausführen und nach ca. 15 Sekunden Task hart beenden 
03.
:: 
04.
start ping.exe -n 300 localhost 
05.
::  
06.
for /L %%X IN (5,-1,2) do ( 
07.
echo Loop=%%X 
08.
C:\WINDOWS\system32\ping.exe -n 3 localhost 
09.
for /f "tokens=2* delims=," %%i in ('"wmic process get processid,commandline /format:csv"') do (@echo %%i|findstr "ping.exe">nul&& set PID=%%j) 
10.
:: 
11.
:: wenn keine PID definiert, dann exit 
12.
:: 
13.
14.
echo timeout 
15.
taskkill /f /PID %PID% 
16.
exit 0
Wenn ich dieses Script ausführe erhalte ich folgende Fehlermeldung;

01.
C:\DOCUME~1\USR~1.DSD\LOCALS~1\Temp\1>echo Loop=%X 
02.
Loop=4 
03.
) was unexpected at this time. 
04.
 
05.
C:\DOCUME~1\USR~1.DSD\LOCALS~1\Temp\1>)
Wenn ich die "innere" FOR Schleife;
01.
for /f "tokens=2* delims=," %i in ('"wmic process get processid,commandline /format:csv"') do (@echo %i|findstr "ping.exe">nul&& echo PID=%j)
separate am CMD ausführe erhalte ich nur "()" Klammern und später das gewünschte Ergebnis. Wenn ich die Klammern hinter dem "DO" weglasse sieht es zumindest richtig aus.
Was ist mein Fehler, bzw. was kann ich tun damit es funktioniert.

Vielen Dank
Mathias
Bitte warten ..
Mitglied: pieh-ejdsch
11.08.2010 um 15:55 Uhr
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
01.
echo 1. Test mit REM innerhalb einer Klammer  
02.
(echo 1.1 
03.
echo 1.2 
04.
echo 1.3 
05.
Rem 
06.
07.
 
08.
echo 2. Test mit Kommentar-Zeilen vor BefehlsZeilen innerhalb einer Klammer  
09.
(::Kommentar vor dem 1.Befehl in der IF-Klammer 
10.
echo 2.1 
11.
::Kommentar vor dem 2.Befehl in der IF-Klammer 
12.
echo 2.2 
13.
::Kommentar vor dem 3.Befehl in der IF-Klammer 
14.
echo 2.3 
15.
::Kommentar vor dem 4.Befehl in der IF-Klammer 
16.
Rem 
17.
18.
 
19.
echo 3. Test mit Kommentar-Zeilen als Letzte Zeile innerhalb einer Klammer - geht NICHT 
20.
(echo 2.1 
21.
echo 2.2 
22.
echo 2.3 
23.
REM 
24.
::Kommentar als Letzte Zeile in der IF-Klammer fasst in die Grütze 
25.
)
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Schleife mit todos CMD

Frage von TommyDerWalker zum Thema Batch & Shell ...

Batch & Shell
gelöst Fehler in Schleife (2)

Frage von miczar zum Thema Batch & Shell ...

Server-Hardware
gelöst Netzteil Watt Power herausfinden (6)

Frage von M.Marz zum Thema Server-Hardware ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (23)

Frage von patz223 zum Thema Windows Userverwaltung ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (19)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...