larz
Goto Top

FOR-Schleife liest Werte nur bis zum ersten Leerzeichen ein

Hallo zusammen,

ich habe ein Scipt, dass aus einer Textdatei Zeilenweise den Namen von Diensten ausliest und deren Status prüft:

set SERVERNAME=Server1

@echo __________________________________________>>"%LogfilePath%\servercheck.log"  
@echo DIENSTE AUF %SERVERNAME%>>"%LogfilePath%\servercheck.log"  
@echo.>>"%LogfilePath%\servercheck.log"  
for /f %%i in (%SERVERNAME%_Dienste.txt) do ( 
	for /f "tokens=4" %%a in ('sc \\%SERVERNAME% query %%i ^| find "STATE"') do 	call :checkit %%i %%a  
)
goto :eof
:checkit Parameter1=Dienst Parameter2=Status
if  /i "%2" NEQ "RUNNING" @echo %1 		%2 >>"%LogfilePath%\servercheck.log"  
if  /i "%2" EQU "RUNNING" @echo %1		%2 >>"%LogfilePath%\servercheck.log"  
goto :eof
echo.
echo.
echo.

Jetzt ist es so dass es einen Dienst gibt, der dummerweise "Object Store Sowieso 6.0" heißt.
Das Script liest mir immer nur "ObjectStore" als Dienstnamen aus und findet dazu natürlich nichts.
Nun habe ich versucht mit dem Zusatz
delims=
dem Script beizubringen, dass er das Leerzeichen nicht als Ende betrachten soll. Oder bin ich da falsch gewickelt??

Danke für eure Hilfe

Gruß
Larz

Content-Key: 146535

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

Printed on: April 23, 2024 at 10:04 o'clock

Member: Dani
Dani Jul 08, 2010 at 14:47:59 (UTC)
Goto Top
Hi Larz,
eine unwichtige Sache: Kannst du uns noch verraten wie eine solche Zeile aussieht? Meine Glaskugel hat schon Wochenende!


Grüße,
Dani
Member: bastla
bastla Jul 08, 2010 at 14:49:47 (UTC)
Goto Top
Hallo Larz!

Da
Oder bin ich da falsch gewickelt??
vermutlich nicht ganz die gewünschte Antwort bringen dürfte face-wink, schließe ich mich Danis Frage an ...

Vorsorglich würde ich aber den "sc"-Teil so schreiben:
sc \\%SERVERNAME% query "%%i"
Grüße
bastla
Member: Larz
Larz Jul 08, 2010 at 14:58:53 (UTC)
Goto Top
Hi Dani,

eine Zeile heißt z.B.

ObjectStore Sowieso 6.0

Gruß
Lars
Member: Biber
Biber Jul 08, 2010 at 14:59:11 (UTC)
Goto Top
[OT]
Moin Larz,

wenn ich so deine Zeilen 13-16 betrachte drängt sich mir die Vermutung auf, dein Cheffe bezahlt dich nach Programmzeilen? *gg

Zeile 14-16 sind wirklich unerreichbar gut ....

...ansonsten bist du ja schon in guten Händen...

Grüße
Biber
[/OT]
Member: Dani
Dani Jul 08, 2010 at 15:06:35 (UTC)
Goto Top
Das Problem wird wohl sein, dass die FOR-Schleife als Standardtrennzeichen das Leerzeichen nimmt wenn nicht anders angeben. Sprich du musst die Parameter in deiner Schleife anpassen:
for /f "tokens=4 delims=" %%a in ('sc \\%SERVERNAME% query %%i ^| find "STATE"') do call :checkit %%i %%a  


Grüße,
Dani
Member: bastla
bastla Jul 08, 2010 at 15:13:36 (UTC)
Goto Top
@Dani
Des Weiteren ist der : bei checkIT zu viel. Du möchtest zur Sprungmarke springen und keine an dieser Stelle erzeugen.
Einspruch! "call" braucht die vollständige Sprungmarke inkl ":" ...

Grüße
bastla
Member: Dani
Dani Jul 08, 2010 at 15:17:48 (UTC)
Goto Top
@bastla
Right... ich blick's bald nicht mehr vor lauter Programmiersprachen. Hab's verbessert...


Grüße,
Dani
Member: Larz
Larz Jul 08, 2010 at 16:59:27 (UTC)
Goto Top
Hoi Biber,

freut mich, wenn meine Zeilen für ein Schmunzeln sorgen face-smile
Im Ernst - mein Chef bezahlt mir dafür gar nichts, das mach ich nebenher weil ich nich alles per Hand machen will, aber ok, 14 bis 16 sind bei näherer Betrachtung echt schwachsinnig, kommt aus dem Bereich "Den Wald vor lauter Bäumen nicht..." - das gesamte Script ist historisch gewachsen...

Gruß
Larz
Member: Larz
Larz Jul 09, 2010 at 05:38:26 (UTC)
Goto Top
Hallo Dani,

das war auch mein erster Ansatz - aber da es nicht funktioniert hatte, habe ich es verworfen (ich war der Meinung ich hätte es falsch gemacht).
Habe deine Zeile 1 zu 1 kopiert, klappt leider dennoch nicht. Er macht aus "OBjectStore Sowieso 6.0" wieder nur "ObjectStore"...

Gruß
Larz
Member: Larz
Larz Jul 09, 2010 at 05:39:03 (UTC)
Goto Top
Moin Bastla,

die "" bringen leider keine Verbesserung...

Gruß
Larz
Member: bastla
bastla Jul 09, 2010 at 07:21:16 (UTC)
Goto Top
Hallo Larz!

Also bei mir erzeugt
@echo on & setlocal
set SERVERNAME=Server1

@echo __________________________________________>>"%LogfilePath%\servercheck.log"  
@echo DIENSTE AUF %SERVERNAME%>>"%LogfilePath%\servercheck.log"  
@echo.>>"%LogfilePath%\servercheck.log"  
for /f "delims=" %%i in (%SERVERNAME%_Dienste.txt) do (   
	for /f "tokens=4" %%a in ('sc \\%SERVERNAME% query "%%i" ^| find "STATE"') do 	call :checkit "%%i" %%a  
)
goto :eof
:checkit Parameter1=Dienst Parameter2=Status
if  /i "%2" NEQ "RUNNING" @echo %1 		%2 >>"%LogfilePath%\servercheck.log"  
if  /i "%2" EQU "RUNNING" @echo %1		%2 >>"%LogfilePath%\servercheck.log"  
goto :eof
folgenden Ablauf (der zumindest hinsichtlich der eigentlichen Fragestellung für mich vernünftig aussieht):
D:\TEMP>set SERVERNAME=Server1

D:\TEMP>for /F "delims=" %i in (Server1_Dienste.txt) do (for /F "tokens=4" %a in
 ('sc \\Server1 query "%i" | find "STATE"') do call :checkit "%i" %a )

D:\TEMP>(for /F "tokens=4" %a in ('sc \\Server1 query "ObjectStore Sowieso 6.0"
| find "STATE"') do call :checkit "ObjectStore Sowieso 6.0" %a )

D:\TEMP>goto :eof
Bitte beachten: Auch bei der Übergabe von "%%i" als Parameter werden die Anführungszeichen benötigt, da bei Leerzeichen in "%%i" der Wert von "%%a" nicht als %2 im Unterprogramm ankommt ...

Grüße
bastla
Member: Larz
Larz Jul 12, 2010 at 10:40:14 (UTC)
Goto Top
Hoi bastla,

das war's! Super, danke. Diese elenden "" immer... face-smile

Gruß
Larz