Batchprogrammierung GOTO-Sprungmarken innerhalb einer Schleife.
Mein Skript bricht bei einer GOTO-Sprungmarke innerhalb einer For-Schleife ab. Ich weiß aber nicht warum.
Hallo zusammen. Ich habe ein kleines Skript geschrieben, welches immer abbricht wenn er zu der Sprungmarke "goto PATCHWECHSEL" kommt.
Zur Erklärung
In der Datei "\\%%d\d$\VRZ\Logs\Installationsprotokoll.txt" werden bei uns die Einzelnen Patchinstallationen nachgehalten (Auszug aus dieser Datei "03.07.2007 09:23:48: K_20_SRC_6.0 Ende Deinstallation auf Server")
In der Datei "anpassen_server.txt" sind die Server angegeben von denen die Ausgabe kommen soll.
In der Datei "anpassen_patche.txt" sind die Patche angegeben ( Bei dem obrigen Auszug ist es z.B. K_20_SRC_6.0)
Mein Ziel ist, dass ich auf den Servern prüfen möchte, ob ein Patch installiert wurde und ob danach gebootet wurde. Wenn ich die Sprungmarke entnehme läuft das Script durch, aber die Ausgabe wird unsauber und die Daten sind falsch, weil die falschen Variablen übergeben werden.
Gibt es denn noch eine Möglichkeit innerhalb einer Forschleife zu spingen?
Hallo zusammen. Ich habe ein kleines Skript geschrieben, welches immer abbricht wenn er zu der Sprungmarke "goto PATCHWECHSEL" kommt.
Zur Erklärung
In der Datei "\\%%d\d$\VRZ\Logs\Installationsprotokoll.txt" werden bei uns die Einzelnen Patchinstallationen nachgehalten (Auszug aus dieser Datei "03.07.2007 09:23:48: K_20_SRC_6.0 Ende Deinstallation auf Server")
In der Datei "anpassen_server.txt" sind die Server angegeben von denen die Ausgabe kommen soll.
In der Datei "anpassen_patche.txt" sind die Patche angegeben ( Bei dem obrigen Auszug ist es z.B. K_20_SRC_6.0)
Mein Ziel ist, dass ich auf den Servern prüfen möchte, ob ein Patch installiert wurde und ob danach gebootet wurde. Wenn ich die Sprungmarke entnehme läuft das Script durch, aber die Ausgabe wird unsauber und die Daten sind falsch, weil die falschen Variablen übergeben werden.
Gibt es denn noch eine Möglichkeit innerhalb einer Forschleife zu spingen?
@echo on
setlocal ENABLEDELAYEDEXPANSION
rem löschen der alten Auswertungsdatei
if /i exist auswertung_*.log del /q auswertung_*.log
rem Datumseinstellung
for /f "tokens=1,2,3 delims=." %%a in ('echo %date%') do set datum=%%c-%%b-%%a
rem Log-Variabel
set logs=auswertung_%datum%.log
rem Serverauswahl
for /f %%d in (anpassen_server.txt) do (
rem Serverausgabe
echo %%d>>%logs%
rem Protokoll-Variabel
set instprot=\\%%d\d$\VRZ\Logs\Installationsprotokoll.txt
rem Abfrage ob Protokoll vorhanden ist
if /i not exist !instprot! echo Das Protokoll fehlt>>%logs% & goto SERVERWECHSEL
rem Abfrage des letzten Bootvorgangs
for /f %%e in ('WMIC.EXE /Node:%%d /Output:STDOUT Path Win32_OperatingSystem Get LastBootUpTime /Format:TABLE') do set lastboot=%%e
set lastboot=!lastboot:~0,14!
rem Patchauswahl
for /f "tokens=1" %%f in (anpassen_patche.txt) do (
rem Prüfung on der Patch erfolgreich installiert wurde
for /f "tokens=3 delims= " %%w in ('find /i /c "%%f Abgeschlossen" !instprot!') do (
set patch=%%w
)
if !patch! EQU 0 echo Der Patch %%f fehlt >>%logs% & ##red| goto PATCHWECHSEL##
rem Installationszeitpunkt ermitteln
for /f "tokens=1,2,3,4 delims= " %%g in ('find /i "%%f Abgeschlossen" !instprot!') do set installdate=%%g & set installtime=%%h
echo !installdate!!installtime!>>%logs%
set patchdate=!installdate:~6,4!!installdate:~3,2!!installdate:~0,2!!installtime:~0,2!!installtime:~3,2!!installtime:~6,2!
rem Ausgabe in die Datei
echo %%f !patchdate!>>%logs%
echo !lastboot!>>%logs%
##red|:PATCHWECHSEL##
echo.
)
:SERVERWECHSEL
echo. >>%logs%
)
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 176802
Url: https://administrator.de/contentid/176802
Ausgedruckt am: 14.11.2024 um 03:11 Uhr
6 Kommentare
Neuester Kommentar
Aloha,
greetz André
- benutze bitte die ##blue|##-Formatierung ...
goto
innerhalb einer Schleife ist unzulässig, ein wenig #comment-toc20 Suchen (link) hier im Forum hätte dir das aber längst gesagt ... wenn du aus einer Schleife eine Sprungmarke aufrufen willst, tu das bitte mitcall: Sprungmarke
und vergiss das oder eventuell diegoto :eof
nicht
greetz André
Aloha,
da ich bei dir nicht durchblicke, wann was wohin gehen soll und ob es beendet werden soll oder danach weitergeführt, bekommst du vorläufig einfach nur eine Erklärung zum
Da du uns nur leere Unterprogramme
greetz André
da ich bei dir nicht durchblicke, wann was wohin gehen soll und ob es beendet werden soll oder danach weitergeführt, bekommst du vorläufig einfach nur eine Erklärung zum
call
und goto :eof
.- mit
call
rufst du hier ein Unterprogramm (per Sprungmarke) auf, das funktioniert in derselben Weise als würdest du damit eine neue Batch aufrufen ... du kannst percall :Sprungmarke %%f
z.B. Laufvariablen aus Schleifen übergeben (welche dann im Unterprogramm als Parameter%1
etc. ansprechbar sind goto :eof
beendet ein Programm, ist es ein Unterprogramm (percall
), wird nur dieses beendet, springt zurück zum Ausgangspunkt des Programms, aus dem das Unterprogramm aufgerufen wurde und führt alles nachkommende ganz normal aus ... wenn kein Unterprogramm mehr existiert, bewirktgoto :eof
, dass sich das Hauptprogramm und damit die batch beendet
Da du uns nur leere Unterprogramme
:PATCHENDE
und :SERVERENDE
angibst bzw. halbausgefüllte, ist mir unklar, ob die nun ein Ende des Hauptprogrammes im jeweiligen Fall darstellen oder eventuell eigentlich überhaupt überflüssig sind oder doch nur einen Zwischensprung darstellen.greetz André
moin,
ist doch ganz einfach und eigentlich hast du dir da oben grad selber die Antwort gegeben..
Und das nur mal eben schnell mit deinen Zeilen zusammengezimmert, ungetestet und das geht natürlich noch viel hybscher.
Gruß
ist doch ganz einfach und eigentlich hast du dir da oben grad selber die Antwort gegeben..
27. if !patch! EQU 0 echo Der Patch %%f fehlt >>%logs%
28. if not !patch! EQU 0 for /f "tokens=1" %%f in (anpassen_patche.txt) do (
28. if not !patch! EQU 0 for /f "tokens=1" %%f in (anpassen_patche.txt) do (
Und das nur mal eben schnell mit deinen Zeilen zusammengezimmert, ungetestet und das geht natürlich noch viel hybscher.
Gruß