Batchprogrammierung GOTO-Sprungmarken innerhalb einer Schleife.
Metzger000 (Level 1) - Jetzt verbinden
25.11.2011, aktualisiert 18.10.2012, 10466 Aufrufe, 6 Kommentare
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?
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%
)
6 Antworten
- LÖSUNG Skyemugen schreibt am 25.11.2011 um 08:06:49 Uhr
- LÖSUNG Metzger000 schreibt am 25.11.2011 um 11:20:30 Uhr
- LÖSUNG Skyemugen schreibt am 25.11.2011 um 12:25:46 Uhr
- LÖSUNG Metzger000 schreibt am 25.11.2011 um 13:09:17 Uhr
- LÖSUNG 60730 schreibt am 25.11.2011 um 17:07:15 Uhr
- LÖSUNG Metzger000 schreibt am 29.11.2011 um 09:07:54 Uhr
- LÖSUNG 60730 schreibt am 25.11.2011 um 17:07:15 Uhr
- LÖSUNG Metzger000 schreibt am 25.11.2011 um 13:09:17 Uhr
- LÖSUNG Skyemugen schreibt am 25.11.2011 um 12:25:46 Uhr
- LÖSUNG Metzger000 schreibt am 25.11.2011 um 11:20:30 Uhr
LÖSUNG 25.11.2011, aktualisiert 18.10.2012
Aloha,
greetz André
- benutze bitte die <code></code>-Formatierung ...
- goto innerhalb einer Schleife ist unzulässig, ein wenig 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 mit call: Sprungmarke und vergiss das oder eventuell die goto :eof nicht
greetz André
LÖSUNG 25.11.2011 um 11:20 Uhr
Ich habe es jetzt mal ausprobiert mit call.
Meinst du so etwa? Das klappt bei mir immer noch nicht. Mit der goto :EOF weiß ich nicht genau, wie ich das implementieren könnte, weil es ja ans Ende der Batchdatei geht und nicht ans Ende meiner Schleife, oder irre ich mich?
Meinst du so etwa? Das klappt bei mir immer noch nicht. Mit der goto :EOF weiß ich nicht genau, wie ich das implementieren könnte, weil es ja ans Ende der Batchdatei geht und nicht ans Ende meiner Schleife, oder irre ich mich?
@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
:SERVERANWAHL
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% & call :SERVERNEXT
rem Abfrage des letzten Bootvorgangs
:BOOTVORGANG
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
:PATCHANWAHL
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% & goto :PATCHNEXT
rem Installationszeitpunkt ermitteln
:INSTALLATIONSZEITPUNKT
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%
:PATCHENDE
echo.
)
:SERVERENDE
echo. >>%logs%
)
Exit
:PATCHNEXT
goto PATCHENDE
:SERVERNEXT
goto SERVERENDE
LÖSUNG 25.11.2011 um 12:25 Uhr
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 call und goto :eof.
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é
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 per call :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 (per call), 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, bewirkt goto :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é
LÖSUNG 25.11.2011 um 13:09 Uhr
Hi André
Mit :PATCHENDE und :SERVERENDE will ich eigentlich nur an das Ende der Schleifen springen.
Was ich ja bezwecken möchte ist, dass wenn bestimmte Voraussetzungen nicht erfüllt werden, dass die folgenden Zeilen einfach übersprungen werden.
Hiermit were ich aus, ob der Patch installiert ist. Wenn !patch! = 0 ist ist er nicht installiert und soll die folgenden Zeilen überspringen und ans Ende der Schleife springen.
Mit :PATCHENDE und :SERVERENDE will ich eigentlich nur an das Ende der Schleifen springen.
Was ich ja bezwecken möchte ist, dass wenn bestimmte Voraussetzungen nicht erfüllt werden, dass die folgenden Zeilen einfach übersprungen werden.
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% & goto :PATCHNEXT
LÖSUNG 25.11.2011 um 17:07 Uhr
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ß
LÖSUNG 29.11.2011 um 09:07 Uhr