larz
Goto Top

Problem mit FOR-Schleife

Guten Morgen an alle,

gestern hatte ich eine Frage zum Auslesen des Dienst-Status auf einem entfernten, wo mir Torsten helfen konnte.
Nun hab ich das Ding versucht auszubauen und habe ein Problem mit einer FOR-Schleife (die ich grundsätzlich leider nie so ganz verstanden habe).

Es geht um den Bereich Massenprüfung. Ich möchte die Prüfung für jeden Client machen, der in einer extern vorgehaltenen Liste "Computer.txt" steht.
Leider bricht mir das Script genau an der Stelle ab und ich befürchzte dass es was mit meiner FOR-Schleife zu tun hat.

Kann mir da mal jemand unter die Arme greifen?

cls

set /p Dienstname=Bitte Dienstname (nicht Anzeiguename!) eingeben: 

:AbfrageEinzelOderMasse
set /p EinzelOderMasse="Möchten Sie eine (E)inzel- oder (M)assenprüfung (mit Liste) durchführen?"  
if /i %EinzelOderMasse% == e goto :Einzelpruefung
if /i %EinzelOderMasse% == m goto :Massenpruefung
cls
@echo Falsche Eingabe
goto :AbfrageEinzelOderMasse

:Massenpruefung
for /f %%i in ("Computernamen.txt") do (  
@echo Prüfe %Computer2Check%
for /f "tokens=4"  %%a in ('sc \\%%i query %dienstname% ^| find "STATE"') do set Status=%%a   
)
if not %STATUS%==RUNNING goto :ServiceStopped
EXIT

:Einzelpruefung
Set /p Computer2Check=Bitte Comuternamen eingeben:  
for /f "tokens=4"  %%a in ('sc \\%Computer2Check% query %dienstname% ^| find "STATE"') do set Status=%%a   
if not %STATUS%==RUNNING goto :ServiceStopped
@echo Status des Dienstes "%Dienstname%" ist %Status%  
pause

:ServiceStopped
@echo %Computer2Check%;%time%;%date% >>\\filer-a\protokolle$\%date%_ServiceStopped.log

Vielen Dank!

Gruß
Lars

Content-ID: 135135

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

Ausgedruckt am: 25.11.2024 um 01:11 Uhr

bastla
bastla 04.02.2010 um 10:13:51 Uhr
Goto Top
Hallo Larz!

Ändere die Zeile 14 auf:
for /f "usebackq" %%i in ("Computernamen.txt") do (
Grüße
bastla
Larz
Larz 04.02.2010 um 10:32:05 Uhr
Goto Top
Hoi Bastla,

birngt leider keine Veränderung. Habe mittels Pause gesehen (ohne deine Ergänzung), dass anstatt den EInzelnen Namen in der Liste in der Variable %%i der Dateiname Computer.txt steht

Hm...

Gruß
Lars
bastla
bastla 04.02.2010 um 11:49:39 Uhr
Goto Top
Hallo Larz!
abe mittels Pause gesehen (ohne deine Ergänzung), dass anstatt den EInzelnen Namen in der Liste in der Variable %%i der Dateiname Computer.txt steht
Solange Du das "usebackq" nicht angibst, wird "Computer.txt" nicht als Dateiname, sondern als Text interpretiert ...

... mit "usebackq" sollte es aber klappen.

Grüße
bastla
5t8d1e
5t8d1e 04.02.2010 um 12:33:11 Uhr
Goto Top
Hallo,

schau dir das einmal an:
@echo off
cls 
set /p Dienstname=Bitte Dienstname (nicht Anzeiguename!) eingeben:  

:AbfrageEinzelOderMasse 

set /p EinzelOderMasse="Möchten Sie eine (E)inzel- oder (M)assenprüfung (mit Liste) durchführen?"   
if /i %EinzelOderMasse% == e goto :Einzelpruefung 
if /i %EinzelOderMasse% == m goto :Masse
cls 
@echo Falsche Eingabe 
goto :AbfrageEinzelOderMasse 

:Einzelpruefung 
Set /p Computer2Check=Bitte Comuternamen eingeben:   
for /f "tokens=4"  %%a in ('sc \\%Computer2Check% query %dienstname% ^| find "STATE"') do set Status=%%a    
if not %STATUS%==RUNNING call :ServiceStopped %computer2check%
@echo Status des Dienstes "%Dienstname%" ist %Status%   
pause 


:Masse
for /f %%a in (Computernamen.txt) do (
	echo Prüfe %%a
	for /f "tokens=4"  %%b in ('sc \\%%a query %dienstname% ^| find "STATE"') do if not %%b==RUNNING  call :ServiceStopped %%a  
	)
EXIT 


 
:ServiceStopped
@echo %1;%time%;%date% >>\\filer-a\protokolle$\%date%_ServiceStopped.log
Biber
Biber 04.02.2010 um 13:03:48 Uhr
Goto Top
Moin 5t8d1e,

Sauber. Als winzigkleine Ergänzung...
... vielleicht noch nach Zeile 19 oder 20 (jedenfalls zwischen Block ":Einzelpruefung" und ":Masse") ein "GoTo :eof" ?

@Larz
Und wenn überhaupt ein EXIT in einem Batch... dann sollte es in allen denkbaren Fällen ( User bricht ab, Einzelverarbeitung , Massenverarbeitung) verwendet werden, nicht nur in einem UseCase.

Grüße
Biber
Larz
Larz 04.02.2010 um 14:09:00 Uhr
Goto Top
Servus,

danke für die Unterstützung. Ich hab ziemlich viel Zeit mit den "" verplämpert, hab jetzt aber auch ne funktionierende Lösung und schon etwas ausgebaut:

REM Dieses Script erm%oe%glicht es bei einem oder mehreren PCs den Status eines Dienstes 
REM zu %ue%berpr%ue%fen. Ist der Dienst gestoppt, wird dies in ein Log geschrieben oder angezeigt

@ECHO OFF & SETLOCAL 

REM Hier werden Variablen für die Umlaute definiert, damit Sie nachher im Text richtig angezeigt werden (ANSI/ASCI-Problem)
chcp 1252>nul
set ue=ü
set ae=ä
set oe=ö
set Uue=Ü
set Aae=Ä
set Ooe=Ö
set ss=ß
chcp 850>nul

REM Hier wird die Farbe der Fenster bestimmt
COLOR 0E

CLS


@echo ================================================== 
@echo #           C H E C K   S E R V I C E            #
@echo ==================================================
@echo.
@echo Dieses Script erm%oe%glicht es bei einem oder 
@echo mehreren PCs den Status eines Dienstes zu %ue%ber-
@echo pr%ue%fen. Ist der Dienst gestoppt, wird dies in 
@echo ein Log geschrieben oder bei Einzelabfrage im 
@echo Script angezeigt
@echo.
set /p Dienstname=Bitte Dienstname (nicht Anzeigename!) eingeben: 
@echo.
:AbfrageEinzelOderMasse
set /p EinzelOderMasse="M%oe%chten Sie eine (E)inzel- oder (M)assenpr%ue%fung (mit Liste) durchf%ue%hren?"  
if /i %EinzelOderMasse% == e goto :Einzelpruefung
if /i %EinzelOderMasse% == m goto :Massenpruefung
cls
@echo Falsche Eingabe
goto :AbfrageEinzelOderMasse

:Massenpruefung
for /f "usebackq" %%i in ("Computernamen.txt") do (  
	@echo Pr%ue%fe %%i
	for /f "tokens=4"  %%a in ('sc \\%%i query %dienstname% ^| find "STATE"') do (  
		set Status=%%a
		if %%a==STOPPED @echo %%i;%dienstname%;%%a;%time%>>\\filer-a\protokolle$\%date%_ServiceStopped.log
		)
)
PAUSE

:Einzelpruefung
Set /p Computer2Check=Bitte Comuternamen eingeben:  
for /f "tokens=4"  %%a in ('sc \\%Computer2Check% query %dienstname% ^| find "STATE"') do set Status=%%a   
if not %STATUS%==RUNNING @echo %Computer2Check%;%dienstname%;%status%;%time% >>\\filer-a\protokolle$\%date%_ServiceStopped.log
@echo Status des Dienstes "%Dienstname%" ist %Status%  

Funktioniert beides prima
Danke nochmal an alle Beteiligten!!!

Gruß
Larz