Batch einfache For Schleife für einen Block
Hallo Zusammen,
brauche mal ein wenig Nachhilfe. Möchte in einer Batch gerne eine for Schleife einbauen, die aber dann den Block nach dem dritten Durchlauf beendet mit einem Goto.
Geht das so überhaupt?
Danke
brauche mal ein wenig Nachhilfe. Möchte in einer Batch gerne eine for Schleife einbauen, die aber dann den Block nach dem dritten Durchlauf beendet mit einem Goto.
@echo off
set LOOPSTART=1
set LOOPSTEP=1
set LOOPEND=3
for /l %%i in (%LOOPSTART%,%LOOPSTEP%,%LOOPEND%) do goto test %%i
:test
echo.
echo bin durch!
Geht das so überhaupt?
Danke
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 588538
Url: https://administrator.de/forum/batch-einfache-for-schleife-fuer-einen-block-588538.html
Ausgedruckt am: 22.12.2024 um 10:12 Uhr
8 Kommentare
Neuester Kommentar
Moin,
Du brauchst hier überhaupt kein goto anzuwenden, die Schleife endet automatisch nach 3 Durchläufen, eben genau dafür ist /L ja da.
mach einfach mal
Gruß Thomas
Zitat von @zeroblue2005:
Geht das so überhaupt?
So nein, du verlässt direkt schon beim ersten Durchgang die Schleife durch das goto.Geht das so überhaupt?
for /l %%i in (%LOOPSTART%,%LOOPSTEP%,%LOOPEND%) do goto test %%i
Du brauchst hier überhaupt kein goto anzuwenden, die Schleife endet automatisch nach 3 Durchläufen, eben genau dafür ist /L ja da.
mach einfach mal
for /l %%i in (%LOOPSTART%,%LOOPSTEP%,%LOOPEND%) do echo Durchlauf %%i
Gruß Thomas
Wozu ist die Variable "%%i" nach dem "do goto test"?
Test ist keine Funktion, der du eine Variable übergeben könntest, falls du das meinst. Es ist eine Sprungmarke. Es springt so oder so dahin und die Variable existiert auch noch im Speicher um sie unter :test abfragen zu können.
Auch muss es nach dem :test seinen Weg zurück finden, was es nicht tut. Deswegen benutze statt "goto" das "gosub" und beende die routine mit "return".
Test ist keine Funktion, der du eine Variable übergeben könntest, falls du das meinst. Es ist eine Sprungmarke. Es springt so oder so dahin und die Variable existiert auch noch im Speicher um sie unter :test abfragen zu können.
Auch muss es nach dem :test seinen Weg zurück finden, was es nicht tut. Deswegen benutze statt "goto" das "gosub" und beende die routine mit "return".
Zitat von @NordicMike:
Auch muss es nach dem :test seinen Weg zurück finden, was es nicht tut. Deswegen benutze statt "goto" das "gosub" und beende die routine mit "return".
Das ist Batch, kein Basic . Ich übersetze mal: Deswegen benutze statt "goto" "call" und beende die routine mit "goto :EoF"Auch muss es nach dem :test seinen Weg zurück finden, was es nicht tut. Deswegen benutze statt "goto" das "gosub" und beende die routine mit "return".
Allerdings glaube ich eher, das er mit dem goto die For-Schleife beenden wollte, sonst macht das "echo bin durch!" nämlich auch keinen Sinn.
Gruß Thomas
Full ack.
Das kommt davon, wenn man zu viele Sprachen im Kopf hat und jede nur zu 20%.
Stimmt, das mit dem "Block" ist nicht definiert. Er soll uns mal zeigen was in der Schleife tatsächlich ausgeführt werden soll. Als Block versehe ich mehrere Befehle und bin deshalb von einer Subroutine ausgegangen. Das wird er dann schon merken, wenn der Text 3x erscheint, dass er durch ist :c)
Das kommt davon, wenn man zu viele Sprachen im Kopf hat und jede nur zu 20%.
Stimmt, das mit dem "Block" ist nicht definiert. Er soll uns mal zeigen was in der Schleife tatsächlich ausgeführt werden soll. Als Block versehe ich mehrere Befehle und bin deshalb von einer Subroutine ausgegangen. Das wird er dann schon merken, wenn der Text 3x erscheint, dass er durch ist :c)
Zitat von @zeroblue2005:
Nun möchte ich erreichen das der Teil "vpnpruefen" drei mal durchlaufen wird, immer dann wenn if errorlevel 1 ist. Denn jetzt läuft die Schleife drei mal durch und geht dann erst in den unteren Block! Sprich, wie gestalte ich die Batch so, dass er weiss, wo er raus muss aus der schleife = Bedingung erfüllt! Da tue ich mich gerade schwer mit!
Nun möchte ich erreichen das der Teil "vpnpruefen" drei mal durchlaufen wird, immer dann wenn if errorlevel 1 ist. Denn jetzt läuft die Schleife drei mal durch und geht dann erst in den unteren Block! Sprich, wie gestalte ich die Batch so, dass er weiss, wo er raus muss aus der schleife = Bedingung erfüllt! Da tue ich mich gerade schwer mit!
setlocal EnableDelayedExpansion
for /l %%i in (%LOOPSTART%,%LOOPSTEP%,%LOOPEND%) do (
REM Pruefung ob VPN OK ist
echo Durchlauf %%i
set ipnetz=192.168.178
set serverip=205
ping !ipnetz!.!serverip! -n 2 -w 2000 -l 500
if "!errorlevel!" equ "0" goto :Next
)
REM Hier kommt der Reconnect hin
REM Ende Reconnect
:Next
Falls nach :Next kein Code mehr folgt, kannst du das "goto :Next" auch durch "goto :EoF" (Bedeutet "End of File") ersetzen und die Sprungmarke ":Next" löschen.
Eine Überprüfung eines Pings mittels Errorlevel ist nicht zuverlässig, dies sollte man mittels find oder findstr machen, oder noch besser gleich die PS nutzen
https://ss64.com/nt/ping.html
https://ss64.com/nt/ping.html
A successful PING does NOT always return an %errorlevel% of 0
Therefore to reliably detect a successful ping, pipe the output into FIND and look for the text "TTL"
Therefore to reliably detect a successful ping, pipe the output into FIND and look for the text "TTL"