Batchdatei prüft ob Dienst gestartet ist
Hallo!
Ich möchte eine Batchdatei schreiben, welche prüft ob ein Dienst (SMTP-Server) gestartet ist.
Falls er nicht gestartet ist, soll er gestartet werden
Aber die Batch soll nicht beenden und neu starten, sondern nur starten wenn nicht gestartet!
Hat jemand eine Idee?
Danke und Gruß
Ich möchte eine Batchdatei schreiben, welche prüft ob ein Dienst (SMTP-Server) gestartet ist.
Falls er nicht gestartet ist, soll er gestartet werden
Aber die Batch soll nicht beenden und neu starten, sondern nur starten wenn nicht gestartet!
Hat jemand eine Idee?
Danke und Gruß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 59220
Url: https://administrator.de/contentid/59220
Ausgedruckt am: 26.11.2024 um 03:11 Uhr
29 Kommentare
Neuester Kommentar
Hallo adminit,
also ich probier mal mein Glück. Mein System ist WindowsXP Professional + SP2.
Version 0.1:
Du musst legendlich Ablagemappe durch deinen Dienstnamen ersetzen. Aber warte noch bis einer unseren Skriptexperten (z.B. Biber, bastla, miniversum) deinen Beitrag gelesen hat. Vielleicht geht's noch einfacher.
Gruß
Dani
also ich probier mal mein Glück. Mein System ist WindowsXP Professional + SP2.
Version 0.1:
@echo off & setlocal
for /f "tokens=6 delims= " %%a in ('sc getkeyname Ablagemappe') do set dienst=%%a
for /f "tokens=3 skip=3 delims=: " %%b in ('sc query %dienst%') do set status=%%b
if /i "%status%" == "stopped" net start %status%
pause
Gruß
Dani
Hi,
ginge auch über Errorlevel und der Statusabfrage, hier ein Beispiel für einige Dienste von der Microsoft Seite: http://support.microsoft.com/kb/194916/de
Gruß
cykes
ginge auch über Errorlevel und der Statusabfrage, hier ein Beispiel für einige Dienste von der Microsoft Seite: http://support.microsoft.com/kb/194916/de
Gruß
cykes
Moin admin1987,
Danis Beispiel und cykes M$-Link (THX @beide) beantworten die Frage eigentlich vollständig.
Ich wollte mich nur kurz hier einschalten, weil Danis Skizze einen Flüchtigkeitsfehler enthält:
Die vorletzte Zeile heißt natürlich:
Schönes Wochenende
Biber
Danis Beispiel und cykes M$-Link (THX @beide) beantworten die Frage eigentlich vollständig.
Ich wollte mich nur kurz hier einschalten, weil Danis Skizze einen Flüchtigkeitsfehler enthält:
Die vorletzte Zeile heißt natürlich:
STREICHE: if /i "%status%" == "stopped" net start %status%
SETZE: if /i "%status%" == "stopped" net start %dienst%
SETZE: if /i "%status%" == "stopped" net start %dienst%
Schönes Wochenende
Biber
Hmmm...der Dienstname passt??
Änder deinen Batch mal ab:
Falls dort nichts ausgegeben wird, probier folgende Variante:
Gruß
Dani
Änder deinen Batch mal ab:
@echo off & setlocal
REM Prüfen und bei Status nicht gestartet starten von: SMTP-Dienst
for /f "tokens=6 delims= " %%a in ('sc getkeyname SMTPSVC') do set dienst=%%a
echo Dienst: %dienst%
for /f "tokens=3 skip=3 delims=: " %%b in ('sc query %dienst%') do set status=%%b
echo Status: %status%
if /i "%status%" == "stopped" net start %dienst%
pause
@echo off & setlocal EnableDelayedExpansion
REM Prüfen und bei Status nicht gestartet starten von: SMTP-Dienst
for /f "tokens=6 delims= " %%a in ('sc getkeyname SMTPSVC') do set dienst=%%a
echo Dienst: !dienst!
for /f "tokens=3 skip=3 delims=: " %%b in ('sc query !dienst!') do set status=%%b
echo Status: !status!
if /i "!status!" == "stopped" net start !dienst!
Gruß
Dani
Hi,
irgendwas stimmt da mit den delims noch nicht.
Habe selbst nochmal ein bisschen rumprobiert und eine funktionierende, aber sicher nicht
der Biberschen Batch-Ethik entsprechende Lösung gefunden.
Also Biber nochmal wegen kleiner Überarbeitung ansprechen
Gruß
cykes
P.S. Das Problem in Deiner bzw. Danis Version ist, dass "sc query" mehrere Zeilen ausgibt und die Status-Variable mit dem Inhalt der letzten Ausgabezeile überschrieben wird.
irgendwas stimmt da mit den delims noch nicht.
Habe selbst nochmal ein bisschen rumprobiert und eine funktionierende, aber sicher nicht
der Biberschen Batch-Ethik entsprechende Lösung gefunden.
Also Biber nochmal wegen kleiner Überarbeitung ansprechen
@echo off & setlocal EnableDelayedExpansion
REM Prüfen und bei Status nicht gestartet starten von: SMTP-Dienst
for /f "tokens=6 delims= " %%a in ('sc getkeyname "Simple Mail Transfer Protocol (SMTP)"') do set dienst=%%a
echo Dienst: %dienst%
for /f "tokens=2 skip=3 delims=:" %%b in ('sc query %dienst%') do if /i "%%b" == " 1 STOPPED " set status=STOPPED
echo Status: %status%
if /i %status% == STOPPED net start %dienst%
Gruß
cykes
P.S. Das Problem in Deiner bzw. Danis Version ist, dass "sc query" mehrere Zeilen ausgibt und die Status-Variable mit dem Inhalt der letzten Ausgabezeile überschrieben wird.
und noch eine kleine Schönheitskorrektur:
Gruß
cykes
P.S. Das lässt sich jetzt noch um den Dienstatus PAUSED erweitern, falls das bei Dir vorkommen
sollte, dann muss anstatt "net start ..." "net continue" ansgeführt werden.
@echo off & setlocal EnableDelayedExpansion
REM Prüfen und bei Status nicht gestartet starten von: SMTP-Dienst
for /f "tokens=6 delims= " %%a in ('sc getkeyname "Simple Mail Transfer Protocol (SMTP)"') do set dienst=%%a
echo Dienst: %dienst%
for /f "tokens=3 skip=3 delims=: " %%b in ('sc query %dienst%') do if /i "%%b" == "STOPPED" set status=%%b
echo Status: %status%
if /i %status% == STOPPED net start %dienst%
Gruß
cykes
P.S. Das lässt sich jetzt noch um den Dienstatus PAUSED erweitern, falls das bei Dir vorkommen
sollte, dann muss anstatt "net start ..." "net continue" ansgeführt werden.
@cykes
Wenn ich auch noch ein wenig "mitverschönern" darf, würde ich folgende Variante vorschlagen:
Damit wird jeder zurückgegebene Status in der Variablen %Status% gespeichert (nicht nur "STOPPED" - falls man's mal braucht), und die von admin1987 genannte Fehlermeldung sollte auch der Vergangenheit angehören ...
Grüße
bastla
Wenn ich auch noch ein wenig "mitverschönern" darf, würde ich folgende Variante vorschlagen:
@echo off & setlocal
REM Prüfen und bei Status nicht gestartet starten von: SMTP-Dienst
for /f "tokens=6 delims= " %%a in ('sc getkeyname "Simple Mail Transfer Protocol (SMTP)"') do set dienst=%%a
echo Dienst: %dienst%
set Status=
for /f "tokens=3 skip=3 delims=: " %%b in ('sc query %dienst%') do if not defined Status set Status=%%b
echo Status: %Status%
if /i "%Status%" == "STOPPED" net start %dienst%
Grüße
bastla
@bastla Danke für die Korrektur/Ergänzung
Hab mich vorhin nur mal ein bisschen damit auseinandergesetzt, war son Schnellschuss
Hab mich vorhin nur mal ein bisschen damit auseinandergesetzt, war son Schnellschuss
Moin,
wenn ich auch noch drei Anregungen beisteuern darf...
1. Wenn ich genau weiß, dass der (eine einzige) Dienst, um den es geht, der SMTP-Dienst ist,
und weiß, das der auf dem Rechner auch "normalerweise" laufen soll, dann brauche ich wirklich nicht über ein mühsam abgetipptes "ich such mal nach dem Displaynamen Simple Mail Transfer Protocol (SMTP)") den eigentlichen ServiceKeynamen ermitteln.
Den Namen kann ich dann auch genauso fest verdrahtet in der Batch hinterlegen wie den Displaynamen.
Von daher würde ich mir die ganze erste FOR /F-Anweisung schenken.
2. Von der zweiten SC-Ausgabe brauche ich nur eine Zeile: die mit dem Schlüsselwort STATE.
Da steht immer
oder eben nichts, wenn es den gesuchten Dienstnamen gar nicht gibt.
Also ziehe ich diese "STATE " (plus ein Leerzeichen-Zeile mit Find heraus.
3. Den dritten Fall ("wenn es den gesuchten Dienstnamen gar nicht gibt"), der immer zu irgendetwas Hässlichem führt,
weil dann %status% gar nicht gesetzt wird, den fange ich auch ab, indem ich genau diese Variable vorher setze.
Dann habe ich zumindest die Option, auf diesen Fehlerfall zu reagieren. Beispiel siehe unten.
Dann verkürzt sich die ganze Arie auf:
[ungetestete Skizze]
Ginge natürlich noch kürzer, aber so ist es noch ganz übersichtlich und wartbar.
Gruss
Biber
wenn ich auch noch drei Anregungen beisteuern darf...
1. Wenn ich genau weiß, dass der (eine einzige) Dienst, um den es geht, der SMTP-Dienst ist,
und weiß, das der auf dem Rechner auch "normalerweise" laufen soll, dann brauche ich wirklich nicht über ein mühsam abgetipptes "ich such mal nach dem Displaynamen Simple Mail Transfer Protocol (SMTP)") den eigentlichen ServiceKeynamen ermitteln.
Den Namen kann ich dann auch genauso fest verdrahtet in der Batch hinterlegen wie den Displaynamen.
Von daher würde ich mir die ganze erste FOR /F-Anweisung schenken.
2. Von der zweiten SC-Ausgabe brauche ich nur eine Zeile: die mit dem Schlüsselwort STATE.
Da steht immer
STATE : 4 RUNNING
-oder-
STATE : 1 STOPPED
Also ziehe ich diese "STATE " (plus ein Leerzeichen-Zeile mit Find heraus.
3. Den dritten Fall ("wenn es den gesuchten Dienstnamen gar nicht gibt"), der immer zu irgendetwas Hässlichem führt,
weil dann %status% gar nicht gesetzt wird, den fange ich auch ab, indem ich genau diese Variable vorher setze.
Dann habe ich zumindest die Option, auf diesen Fehlerfall zu reagieren. Beispiel siehe unten.
Dann verkürzt sich die ganze Arie auf:
@echo off & setlocal
set Status=NichDa
for /f "tokens=4 %%b in ('sc query SMTPSVC ^|find "STATE "') do set Status=%%b
echo [Debug] Status: %Status%
if /i "%Status%" == "STOPPED" net start %dienst%
if /i "%Status%" == "NichDa" (
echo Irgendetwas Unerwartetes ist passiert...hol mal den Admin..
pause
)
Ginge natürlich noch kürzer, aber so ist es noch ganz übersichtlich und wartbar.
Gruss
Biber
Sorry, die Sterne waren in der ersten Version reingerutscht, wollte nur das " fett hervorheben, ist inszwischen oben korrigiert. Also bitte diese Zeile übernehmen (Sterne weglöschen!)....
Zu Sicherheit nochmal das komplette Script (so läuft es bei mir problemlos):
Zu Sicherheit nochmal das komplette Script (so läuft es bei mir problemlos):
@echo off & setlocal
set Status=NichDa
for /f "tokens=4" %%b in ('sc query SMTPSVC ^|find "STATE "') do set Status=%%b
echo [Debug] Status: %Status%
if /i "%Status%" == "STOPPED" net start %dienst%
if /i "%Status%" == "NichDa" (
echo Irgendetwas Unerwartetes ist passiert...hol mal den Admin..
pause
)
Moin admin1987,
jetzt haben wir uns alle gemeinsam so lange mit dieser Anforderung herumgebalgt,
da möchte ich Deine Musterlösung noch bisschen wartbarer zusammendampfen.
Vorschlag, der exakt den gleichen Funktionsumfang bieten sollte wie die vorhandene Lösung:
[Ungetestete Skizze]
Grüße
Biber
...und THX @cykes für die Tippfehlerkorrektur
jetzt haben wir uns alle gemeinsam so lange mit dieser Anforderung herumgebalgt,
da möchte ich Deine Musterlösung noch bisschen wartbarer zusammendampfen.
Vorschlag, der exakt den gleichen Funktionsumfang bieten sollte wie die vorhandene Lösung:
::----------snipp SvcStarter.bat ----------::
:: Placed in the Public Domain Biber 2007
@echo off & setlocal
Set "Suchstr=DisplayName"
Set "SuchStr=%suchstr%:ServiceKeyname"
goto :skipSomeLines
----ab hier können alle Dienste nach dem skizzierten Muster eingetragen werden...
DisplayName:ServiceKeyname=SMTP-Dienst:SMTPSvc
DisplayName:ServiceKeyname=IMAP-Dienst:IMAP4Svc
DisplayName:ServiceKeyname=MTA-Dienst:MSExchangeMTA
DisplayName:ServiceKeyname=Pop3-Dienst:POP3Svc
DisplayName:ServiceKeyname=Exchange-Ereignis-Dienst:MSExchangeES
DisplayName:ServiceKeyname=Exchange-Informationsspeicher-Dienst:MSExchangeIS
DisplayName:ServiceKeyname=Exchange-Routungs-Dienst:RESvc
DisplayName:ServiceKeyname=Exchange-Standort-Replikationsdienst-Dienst:MSExchangeSRS
DisplayName:ServiceKeyname=Exchange-Systemaufsichts-Dienst:MSExchangeSA
DisplayName:ServiceKeyname=Exchange-Verwaltungs-Dienst:MSExchangeMGMT
----bis hier können alle Dienste nach dem skizzierten Muster eingetragen werden...
:SkipSomeLines
for /f "tokens=3,4 delims=:=" %%i in ('findstr /i /C:"%SuchStr%" %0') do (
call :CheckSvc %%i %%j
)
goto :eof
:CheckSvc Param1=DisplayName Param2=ServiceKeyname
ECHO %1 checken
set Status=NichDa
for /f "tokens=4" %%b in ('sc query %2 ^|find "STATE "') do set Status=%%b
if /i "%Status%" == "NichDa" (
echo [Fehler] %2 [%1] nicht gefunden...hol mal den Admin..
) ELSE (
echo [Debug] Status von %1 [%2]: %Status%
if /i "%Status%" == "STOPPED" net start %2
)
goto :eof
::----------snapp SvcStarter.bat -----------::
Grüße
Biber
...und THX @cykes für die Tippfehlerkorrektur