larz
Goto Top

Echo in for-Schleife syntaktisch nicht richtig

Hallo zusammen,

ich möchte prüfen ob bei einem Server bestimmte Dienste gestartet sind. Dazu benutze ich eine for-Schleife die alle Dienste in der Datei Dienste.txt abarbeitet.
So sieht der Code-Schnipsel momentan aus:

for /f %%i in (Dienste.txt) do (
	for /f "tokens=4"  %%a in ('sc \\LTTFS06 query %%i ^| find "STATE"') do set Status=%%a   
	if not %STATUS%==RUNNING @echo Dienst %%i		läuft nicht>>C:\TEMP\servercheck.log
)

Problem ist:

a) ich bekomme den Fehler: *@echo ist an dieser Stele syntaktisch nicht verarbeitbar*
b) ich hätte gerne noch die else-Funktion drin, also wenn der Dienst läuft, soll
@echo Dienst %%i		OK>>C:\TEMP\servercheck.log

Kann mir hier kurz jemand aushelfen? Danke

Gruß
Larz

Content-Key: 145788

Url: https://administrator.de/contentid/145788

Printed on: April 19, 2024 at 14:04 o'clock

Member: Ellerbrok
Ellerbrok Jun 28, 2010 at 10:57:43 (UTC)
Goto Top
Musst Du nicht eher

@echo off
for /f %%i in (Dienste.txt) do ( 
	for /f "tokens=4"  %%a in ('sc \\LTTFS06 query %%i ^| find "STATE"') do set Status=%%a    
	if not %STATUS%==RUNNING echo Dienst %%i		läuft nicht>>C:\TEMP\servercheck.log 
)

machen? Also OHNE das @?

Gruß,
Marcel
Member: kkboy94
kkboy94 Jun 28, 2010 at 10:59:52 (UTC)
Goto Top
Hallo

@echo off & setlocal
for /f %%i in (Dienste.txt) do (
for /f "tokens=4"  %%a in ('sc \\LTTFS06 query %%i ^| find "STATE"') do set Status=%%a  
) 
if not %STATUS%==RUNNING >>"C:\TEMP\servercheck.log" echo Dienst %%i läuft nicht & goto :end  
>>"C:\TEMP\servercheck.log" echo Dienst %%i OK & goto :end  

:end
pause
goto :eof

So könnte es klappen.
Ich konnts nicht ausprobieren, da ich selbst keinen Server habe

MfG Karsten
Member: pcschrauber
pcschrauber Jun 28, 2010 at 12:23:50 (UTC)
Goto Top
Hallo,

meiner Meinung nach muss es in etwa so aussehen
for /f %%i in (Dienste.txt) do ( set Dienst=%%i
	for /f "tokens=4"  %%a in ('sc \\LTTFS06 query %%i ^| find "STATE"') do set STATUS=%%a  
		call :checkit
)
goto :end

:checkit
if not x%STATUS%==xRUNNING @echo Dienst %Dienst%		läuft nicht>>c:\TEMP\servercheck.log 
goto :eof
:end
pause

Das Problem das du beschreibst kommt daher das mit "SET" gesetzte Variablen nicht in der gleichen for-Schleife verarbeitbar sind. Warum? Keine Ahnung !
Ich würde dir aber WMI ans Herz legen ... ist um Welten schneller und flexibler.

achso und durch die x'e in der if Abfrage fängt man leere Variablen ab. und das @ unterdrückt nur den Bildschirmausdruck .. nicht aber die Umleitung in die log-Datei

ich hoffe das ich helfen konnte
MFG Tino
Member: Larz
Larz Jun 28, 2010 at 12:47:50 (UTC)
Goto Top
Hi Marcel,

nein, das @ ist hier nicht relevant. Geht auch ohne nicht...

Gruß Larz
Member: BigWim
BigWim Jun 28, 2010 at 12:57:10 (UTC)
Goto Top
Das Problem das du beschreibst kommt daher das mit "SET" gesetzte Variablen nicht in der gleichen for-Schleife verarbeitbar sind. Warum? Keine Ahnung !

Dann möchte ich mal einen Tipp weiterreichen, der das erklärt. Ich wußte gar nicht, wie wenig ich über Batch Beschweid weiß face-wink


Zitat von @bastla:
Hallo Markus!

Meine Beispiele sind in vielen Fällen nix anderes als Anwendung der von
Biber in seinen Kommentaren und natürlich
Tutorials vermittelten Grundlagen (und Feinheiten) ...

Grüße
bastla


Markus
Member: Larz
Larz Jun 28, 2010 at 13:02:16 (UTC)
Goto Top
Hi Karsten,

das klappt leider nicht ganz, es erscheint im Log nur einmal der Hinweis "Dienst %i OK", egal ob der Dienst läuft oder nicht...
Kannst Du ja aber auch mit dem eigenen PC testen. Anstatt LTTFS06 einfach den eigenen PC-Namen angeben

Gruß
Lars
Member: Biber
Biber Jun 28, 2010 at 13:16:21 (UTC)
Goto Top
...und falls heute bei der Wärme keiner Lust hat zum Batch-Tutorials-Lesen, dann noch ein Tipp zur gezielten Stichwortsuche..

Suche nach "DelayedExpansion" (hier über die Forumssuche oder bei SetLocal /? am CMD-Prompt.

Aber im Prinzip ist der Ansatz von pcschrauber durchaus praktkabel:
for /f %%i in (Dienste.txt) do ( 
	for /f "tokens=4"  %%a in ('sc \\LTTFS06 query %%i ^| find "STATE"') do 	call :checkit %%i %%a  
)
goto :eof

:checkit Parameter1=Dienst Parameter2=Status
if  /i "%2" NEQ "RUNNING" @echo Dienst %1 läuft nicht - Status ist %2 >>c:\TEMP\servercheck.log   
goto :eof

pause

So ginge es ganz ohne SET und ohne SetLocal EnableDelayedExpansion.
Ggf natürlich noch ergänzt um eine Zeile für "Dienst läuft und das soll auch ins Log" und/oder %date%/%time% und Servernamen.

Grüße
Biber
P.S. Aber das Tut-Lesen bei schlechtem Wetter nachholen!
Member: pcschrauber
pcschrauber Jun 28, 2010 at 13:18:29 (UTC)
Goto Top
Zitat von @BigWim:
Dann möchte ich mal einen Tipp weiterreichen, der das erklärt. Ich wußte gar nicht, wie wenig ich über Batch
Beschweid weiß face-wink

Sollte es doch gehen, face-surprise bitte ich darum diesen Satz aus dem Kopf zu streichen. face-wink
Und eigentlich benutze ich lieber WMI(VBS) und BATCH nur da, wo es gar nicht anders geht. (war aber nicht immer so face-wink)
Member: Larz
Larz Jun 28, 2010 at 14:22:35 (UTC)
Goto Top
Hi Biber,

bei mir funktioniert diese Variante, danke! Hab das jetzt so in meine bat eingebaut:

@echo __________________________________________________________>>C:\TEMP\servercheck.log
@echo Prüfe Status einzelner Dienste auf LTTFS06>>C:\TEMP\servercheck.log
@echo __________________________________________________________>>C:\TEMP\servercheck.log

for /f %%i in (LTTFS06_Dienste.txt) do ( 
	for /f "tokens=4"  %%a in ('sc \\LTTFS06 query %%i ^| find "STATE"') do 	call :checkit %%i %%a  
)
goto :eof

:checkit Parameter1=Dienst Parameter2=Status
if  /i "%2" NEQ "RUNNING" @echo Dienst %1 läuft nicht - Status ist %2 >>c:\TEMP\servercheck.log  
goto :eof

Hab unter die vorletzte Zeile noch ein
if  /i "%2" EQ "RUNNING" @echo Dienst %1 läuft - Status ist %2 >>c:\TEMP\servercheck.log  
eingesetzt


Danke & Gruß
Larz


P.S. : Tutorials lesen bei schlechtem Wetter wird nachgeholt (bzw. wiederholt face-wink)