zeroblue2005
Goto Top

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.

@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

Content-ID: 588538

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

Ausgedruckt am: 22.11.2024 um 00:11 Uhr

TK1987
TK1987 17.07.2020 aktualisiert um 10:17:07 Uhr
Goto Top
Moin,

Zitat von @zeroblue2005:
Geht das so überhaupt?
for /l %%i in (%LOOPSTART%,%LOOPSTEP%,%LOOPEND%) do goto test %%i
So nein, du verlässt direkt schon beim ersten Durchgang die Schleife durch das goto.

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
NordicMike
NordicMike 17.07.2020 um 10:20:43 Uhr
Goto Top
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".
TK1987
TK1987 17.07.2020 aktualisiert um 10:42:34 Uhr
Goto Top
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 face-wink. Ich übersetze mal: Deswegen benutze statt "goto" "call" und beende die routine mit "goto :EoF"

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
NordicMike
NordicMike 17.07.2020 aktualisiert um 11:06:18 Uhr
Goto Top
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)
zeroblue2005
zeroblue2005 17.07.2020 um 11:10:20 Uhr
Goto Top
Hallo Thomas,

danke, ja verstehe! Ich glaube aber ich habe mich falsch verständlich ausgedrückt und möchte mich korigieren...

Ich habe hier z.B. diese Block aus einer Batch:

:VorherigerBlock

:vpnpruefen
set LOOPSTART=1
set LOOPSTEP=1
set LOOPEND=3
for /l %%i in (%LOOPSTART%,%LOOPSTEP%,%LOOPEND%) do echo Durchlauf %%i
sleep 2
REM Pruefung ob VPN OK ist
set ipnetz=192.168.178
set serverip=205
ping %ipnetz%.%serverip% -n 2 -w 2000 -l 500
if %errorlevel%==1 (
goto reconnectvpn
) else (
goto vpnpruefen
)


:HierBeginntEinNeurerBlock
rem usw

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!
TK1987
Lösung TK1987 17.07.2020 aktualisiert um 11:34:40 Uhr
Goto Top
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!
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
Die For-Schleife prüft 3 mal, ob der VPN ok ist. Ist er aber schon beim ersten mal ok (also Errorlevel=0), wird die For-Schleife beendet (goto :Next), Falls bei allen 3 Durchläufen der ping fehlschlägt, wird automatisch hinter der For-Schleife fortgesetzt.

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.
zeroblue2005
zeroblue2005 17.07.2020 um 13:26:07 Uhr
Goto Top
Danke läuft face-smile
144705
144705 17.07.2020 aktualisiert um 13:38:01 Uhr
Goto Top
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
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"