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-ID: 145788

Url: https://administrator.de/forum/echo-in-for-schleife-syntaktisch-nicht-richtig-145788.html

Ausgedruckt am: 22.12.2024 um 19:12 Uhr

Ellerbrok
Ellerbrok 28.06.2010 um 12:57:43 Uhr
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
kkboy94
kkboy94 28.06.2010 um 12:59:52 Uhr
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
pcschrauber
pcschrauber 28.06.2010 um 14:23:50 Uhr
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
Larz
Larz 28.06.2010 um 14:47:50 Uhr
Goto Top
Hi Marcel,

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

Gruß Larz
BigWim
BigWim 28.06.2010 um 14:57:10 Uhr
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
Larz
Larz 28.06.2010 um 15:02:16 Uhr
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
Biber
Biber 28.06.2010 um 15:16:21 Uhr
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!
pcschrauber
pcschrauber 28.06.2010 um 15:18:29 Uhr
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)
Larz
Larz 28.06.2010 um 16:22:35 Uhr
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)