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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 268563
Url: https://administrator.de/contentid/268563
Ausgedruckt am: 23.11.2024 um 01:11 Uhr
2 Kommentare
Neuester Kommentar
Moin,
Zeile 22 ist dein Fehler
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:
und dann Zeile 22 so schreiben
Und Anzahl hinterher mit !Anzahl! ansprechen (delayed expansion,, du weist)
Gruß jodel32
Zeile 22 ist dein Fehler
for /f "Tokens=* delims=;" %%j in ("%Dienste%") do set /a anzahl+=1
Wenn dann müsstest du die Dienste per Leerzeichen trennen:
set "Dienste=MSSQL$SQLEXPRESS SQLBrowser SQLWriter SQLAgent$SQLEXPRESS"
for %%j in (%Dienste%) do set /a anzahl+=1
Gruß jodel32