mavericklp
Goto Top

Liste abarbeiten mit fiktiven array

Moin moin zusammen...
hätte da mal wieder nen problem bei einer batch verarbeitung. Und zwar benutze ich Acronis zum sichern der Computer im Netzwerk. Jetzt ist aber auf einigen Computern ein SQL Dienst installiert. Daher müssen wir diesen abschalten vor dem Sichern. Ich wollte jetzt eine Batch haben, in der ich eine Liste an Diensten steht, die ähnlich wie ein Array verarbeitet werden sollen. Jeder dienst der beendet wird, soll in eine Text datei gespeichert werden. Sobald das Backup durchgelaufen ist, wird diese Batch wieder gestarte, guckt ob die Text datei vorhanden ist und Startet die gepeicherten Dienste.

Das ergebniss, das ich momentan habe, ist das der nur den ersten Token auswertet. Aber nicht die folgenden... Ich hoffe einer von euch kann mir da weiterhelfen

@echo off
Setlocal EnableDelayedExpansion

REM es sind noch einige mehr dienste aber 4 reichen für die übersicht.
set "Dienste=MSSQL$SQLEXPRESS;SQLBrowser;SQLWriter;SQLAgent$SQLEXPRESS"  
set "Index=1"   
set "anzahl=0"  


REM Prüfen ob die Temp txt existiert
if exist C:\Windows\Temp\SQLacronis.txt (
	REM --- SQL starten -----------------------
	REM jeden einzelnen eintrag in der Text Datei durchgehen und den Dienst starten
	for /f %%m in (C:\Windows\Temp\SQLacronis.txt) do (
		net start %%m
	)
	REM Datei der gestopten Dienste löschen
	del C:\Windows\Temp\SQLacronis.txt
) else (
	REM --- SQL beenden -----------------------
	REM Prüfen wie viele Dienste geprüft werden sollen
	for /f "tokens=* delims=;" %%j in ("%Dienste%") do set /a anzahl+=1  

	:Schleife
	for /f "tokens=%Index% delims=;" %%i in ("%Dienste%") do (   
		cls
		echo  Dienstname%%i
		REM Dienste Prüfen
		for /F "tokens=3 delims=: " %%H in ('sc query "%%i" ^| findstr "        STATE"') do (  
			echo %%H
			if /I "%%H" EQU "RUNNING" (  
				REM Dienst ist gestartet
				echo %%i >> C:\Windows\Temp\SQLacronis.txt
				net stop %%i
			)
			if /I "%%H" EQU "STOPPED" (  
				REM Dienst ist angehalten
			) 
		)
		if /I "%%H" NEQ "RUNNING" (  
			if /I "%%H" NEQ "STOPPED" (  
				REM Dienst nicht gefunden
				echo kein dienst gefunden >> C:\Windows\Temp\SQLacronis.txt
			)
		)
		set /a "Index+=1"   
		if /I "%Index%" LSS "%anzahl%" (  
			goto Schleife
		)
	)
)
pause 

Content-ID: 268563

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

Ausgedruckt am: 23.11.2024 um 01:11 Uhr

114757
Lösung 114757 08.04.2015 aktualisiert um 15:01:09 Uhr
Goto Top
Moin,
Zeile 22 ist dein Fehler
for /f "Tokens=* delims=;" %%j in ("%Dienste%") do set /a anzahl+=1 
Anzahl ist hier immer 1 weil for /f pro Zeile zählt und nicht die Anzahl der Delimiter.

Wenn dann müsstest du die Dienste per Leerzeichen trennen:
set "Dienste=MSSQL$SQLEXPRESS SQLBrowser SQLWriter SQLAgent$SQLEXPRESS" 
und dann Zeile 22 so schreiben
for %%j in (%Dienste%) do set /a anzahl+=1 
Und Anzahl hinterher mit !Anzahl! ansprechen (delayed expansion,, du weist)

Gruß jodel32
mavericklp
mavericklp 08.04.2015 um 15:03:30 Uhr
Goto Top
Super vielen Dank!!!
Das war der Hinweis, den ich brauchte.

habe alles noch mal bearbeitet. Einziges Problem, das ich momentan noch habe ist, das der egal ob der dienst läuft oder nicht zu Zeile 42 kommt und in die Datei schreibtt. ist mit aber an sich egal.

@echo off
Setlocal EnableDelayedExpansion


set "Dienste=Spooler MMS SQLWriter SQLAgent$SQLEXPRESS"  
set "Index=1"   
set "anzahl=0"  


REM Prüfen ob die Temp txt existiert
if exist C:\Windows\Temp\SQLacronis.txt (
	REM --- SQL starten -----------------------
	REM jeden einzelnen eintrag in der Text Datei durchgehen und den Dienst starten
	for /f %%m in (C:\Windows\Temp\SQLacronis.txt) do (
		if "%%m" NEQ "NEIN" (  
			net start %%m
		)
	)
	REM Datei der gestopten Dienste löschen
	del C:\Windows\Temp\SQLacronis.txt
) else (
	REM --- SQL beenden -----------------------

	for %%i in (%Dienste%) do ( 
		cls
		echo  Dienstname%%i
		REM Dienste Prüfen
		for /F "tokens=3 delims=: " %%H in ('sc query "%%i" ^| findstr "        STATE"') do (  
			echo %%H
			if /I "%%H" EQU "RUNNING" (  
				REM Dienst ist gestartet
				echo %%i >> C:\Windows\Temp\SQLacronis.txt
				net stop %%i
			)
			if /I "%%H" EQU "STOPPED" (  
				REM Dienst ist angehalten
			) 
		)
		if /I "%%H" NEQ "RUNNING" (  
			if /I "%%H" NEQ "STOPPED" (  
				REM Dienst nicht gefunden
				echo NEIN >> C:\Windows\Temp\SQLacronis.txt
			)
		)
	)
)
pause