CMD-Script zum Abfragen eines Prozesses gesucht

Hallo liebe Experten,

für die automatische Abfrage, ob ein gewisser Prozess auf meinem Rechner (Windows NT/XP) läuft, möchte ich gerne einen kleinen Kommandozeilen-Batch schreiben in der Form:


IF GOTO FEHLER

.FEHLER
ECHO Der Prozess xy läuft nicht
ERROR 8

der Error des Skriptes wird anschließend abgefragt (dafür ist bereits gesorgt). Kann mir jemand verraten, ob und wenn ja, wie ich das hinbekomme oder ob es Alternativen dazu gibt?

Vielen Dank.

Tschüs

Berni

Hallo Berni,

wenn Du Windows XP Professional benutzt dann hilft Dir sicher das Kommando „tasklist“ (zum beenden von Prozessen gibt es dann noch „taskkill“).

Gruß
Volkmar

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Volkmar,

vielen Dank. Tasklist kenne ich jedoch bereits, das muss ich eintippen und kann dann manuell überprüfen, ob der Task da ist oder nicht. Ich möchte das jedoch automatisch von einem Script übernehmen lassen. Kann ich also Tasklist in die IF-Abfrage einbauen? Wenn ja, wie?

Tshüs

Berni

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Dazu gibts den befehl findstr.exe

tasklist | findstr „“ „name“
set Errorcode=%errorlevel%
if ERRORCODE == 0 goto laeuft
laueft nicht …

laeuft

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Berni,

direkt kannst Du das Kommando nicht dafür einsetzen (leider!), aber folgender Batch „proctest.bat“ sollte das erledigen, wonach Du suchst:

@echo off
set retval=0
if „%~1“ EQU „“ goto usage
set pn=%~1
if „%~2“ EQU „“ goto usage
set un=%~2
goto main

:checkproc
for /f „usebackq delims=: tokens=1“ %%a in ( tasklist /fi "imagename eq %pn%" /fi "username eq %un%" /fo csv /nh 2^\>^&1 ^\>nul ) do if „%%a“ NEQ „“ exit /b 1
exit /b 0

:main
call :checkproc
set retval=%errorlevel%
goto eof

:usage
echo Aufruf von %0 Prozessname Benutzername
set retval=1

:eof
if %retval% EQU 0 (
echo Prozess laueft!
) else (
echo Prozess laueft NICHT!
) 1>&2
exit /b %retval%

Aufruf-Beispiel:

proctest.bat cmd.exe "Berni Mustermann"

Wichtig ist, dass Du zwei Parameter übergibst und wenn diese ein Leerzeichen enthalten, sollten sie in Anführungszeichen eingeschlossen werden.

Die eigentliche Arbeit erledigt die „Prozedur“ checkproc, die so in jeden „DOS“-Batch (ab Win2K) eingebaut werden kann, wenn „tasklist.exe“ vorhanden ist.

Gruß
Volkmar

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

1 Like

Hallo Volkmar,

vielen Dank, Du hast mir damit sehr geholfen. Jetzt habe ich leider noch ein kleines Problemchen - der Batch läuft tadellos auf meiner Entwicklungsmaschine (XP). Die Produktionsmaschine ist ein Windows Server 2003 und hier funktioniert irgendetwas mit der „FOR-Syntax“ nicht. Wenn ichs dort ablaufen lasse, bekomme ich IMMER die Meldung, dass der Prozess läuft, auch wenn ich etwas völlig sinnfreies eingebe, das garantiert nicht als Prozess existiert. Irgend eine Idee?

vielen Dank und liebe Grüße

Berni

Hallo Berni,

für das Skript müssen die Befehlserweiterungen eingeschaltet sein. Wenn Du an der Kommandozeile „echo %CMDEXTVERSION%“ eingibst solltest Du als Ergebnis „2“ erhalten. Oder mit „if NOT „%errorlevel%“==“" echo Befehlserweiterungen sind aus!" kanns Du das prüfen.

Falls sie aus sind kannst Du die Eingabeaufforderung mit „cmd /E:open_mouth:N“ starten oder in der Registry den Schlüssel „HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions“ auf 1 setzt. Falls Du keine Adminrechte hast und den Schlüssel unter HKEY_LOCAL_MACHINE nicht verändern darfst, dann gibt es den Eintrag auch noch unter „HKEY_CURRENT_USER“ (selber Restpfad).

Sollte auch das das Problem nicht lösen oder sind die Befehlserweiterungen schon an, dann kannst Du versuchen in dem FOR das Schlüsselwort „usebackq“ löschen und die Backquotes (`) durch Quotes (’) ersetzen.

for /f „delims=: tokens=1“ %%a in ( ‚tasklist /fi „imagename eq %pn%“ /fi „username eq %un%“ /fo csv /nh 2^>^&1 ^>nul‘ ) do if NOT „%%a“=="" exit /b 1

Leider steht mir kein Win2K3-Rechner zur Verfügung, so dass ich es nicht selbst testen kann.

Gruß
Volkmar

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

HalloBerni,

manchmal übertreffe ich mich selbst :wink:

Ersetze die Subroutine „checkproc“ durch folgendes, dann hast Du kein FOR mehr im Code:

checkproc

tasklist /fi „imagename eq %pn%“ /fi „username eq %un%“ /fo csv /nh 2>&1 >nul | findstr /b /l „INFORMATION:“ >nul 2>&1
exit /b %errorlevel%

Gruß
Volkmar

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Volkmar,

vielen herzlichen Dank. Die Erweiterungen waren eingeschalten, damit tat es auch nicht. Deinen zweiten Vorschlag zum Ersetzen des FOR habe ich jetzt noch nicht ausprobiert, da ich mir zwischenzeitlich wie folgt geholfen habe, indem ich ebenfalls eine kleine Änderung an Deinem zuerst vorgeschlagenen Script vorgenommen habe. Wahrscheinliche Ursache, warum es auf WIN2003 nicht läuft ist m.E. die Befehlsfolge 2^>^&1 ^>nul - was immer das auch bedeutet.

Also, So funktionierts jetzt auch mit Win2003:

@echo off
set retval=0
if „%~1“ EQU „“ goto usage
set pn=%~1
if „%~2“ EQU „“ goto usage
set un=%~2
goto main

:checkproc
for /f „usebackq tokens=1“ %%a in ( tasklist /fi "imagename eq %pn%" /fi "username eq %un%" /nh ) do if „%%a“ EQU „%pn%“ exit /b 0
exit /b 1

:main
call :checkproc
set retval=%errorlevel%
goto eof

:usage
echo Aufruf von %0 Prozessname Benutzername
set retval=1

:eof
if %retval% EQU 0 (
echo Prozess laueft!
) else (
echo Prozess laueft NICHT!
)
exit /b %retval%

liebe Grüße

Berni

HalloBerni,

manchmal übertreffe ich mich selbst :wink:

Ersetze die Subroutine „checkproc“ durch folgendes, dann hast
Du kein FOR mehr im Code:

checkproc

tasklist /fi „imagename eq %pn%“ /fi „username eq %un%“ /fo
csv /nh 2>&1 >nul | findstr /b /l „INFORMATION:“ >nul
2>&1
exit /b %errorlevel%

Gruß
Volkmar

Hallo Volkmar,

vielen Dank, Du hast mir damit sehr geholfen. Jetzt habe ich
leider noch ein kleines Problemchen - der Batch läuft tadellos
auf meiner Entwicklungsmaschine (XP). Die Produktionsmaschine
ist ein Windows Server 2003 und hier funktioniert irgendetwas
mit der „FOR-Syntax“ nicht. Wenn ichs dort ablaufen lasse,
bekomme ich IMMER die Meldung, dass der Prozess läuft, auch
wenn ich etwas völlig sinnfreies eingebe, das garantiert nicht
als Prozess existiert. Irgend eine Idee?

vielen Dank und liebe Grüße

Berni

Hallo Berni,

fein, dass Du es zum Laufen gebracht hast.

vorgenommen habe. Wahrscheinliche Ursache, warum es auf
WIN2003 nicht läuft ist m.E. die Befehlsfolge 2^>^&1
^>nul - was immer das auch bedeutet.

Bei der Zeichenfolge „2^>^&1 ^>nul“ gibt es vier Dinge zu erklären:

  1. Das Caret-Zeichen (^) dient als Escape-Zeichen, damit die nachfolgenden Zeichen nicht (zu „früh“) interprtiert werden. Möchte man z.B. in einer echo-Ausgabe ein „&“ ausgeben, dann setzt man ein „^“ davor und es wir nicht als Sonderzeichen interpretiert.

  2. „2>&1“ leitet die Ausgabe des Streams 2 (i.a. der Fehlerkanal) auf den Stream 1 (i.a. der Standarausgabekanal) um.

  3. „>nul“ leitet die Standardausgabe in den Datenmülleimer (Gerät nul) um.

  4. Die Reihenfolge „2>&1 >nul“ sorgt dafür, dass erst die „alte“ Standardausgabe ins Nirvarna geht und dann der Fehlerkanal auf die Standardausgabe kommt damit er vom nachfolgenden Programm als Standareingabe verarbeitet werden kann.

Gruß
Volkmr