cmos78
Goto Top

For Schleife wird 2mal durchlaufen

Hallo Leute,

ich habe eine kleine batch geschrieben, die mir einen bestimmten IP Bereich abscannt und mir die IPs, die nicht erreichbar sind in ein Textfile schreibt. Funktioniert eigentlich auch sehr gut, bis auf folgendees Problem:

Die Schleife wird zweimal durchlaufen. Bei meinem Debugg versuch habe ich mir mal den Zähler ausgeben lassen bei jedem Durchgang.
Er läuft schön brav von 1 durch bis Endwert, dann wird er auf null gesetzt und die Schleife wird erneut durchlaufen. Nach dem zweiten Erreichen des Endwertes, bekommt er auf einmal den Wert, mit dem ich die batch starte und bricht ab.
Dies ist reproduzierbar.
Allerdings kann ich nicht verstehen, wo da der Hund begraben ist?!

Ich wäre für jede Hilfe dankbar!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@echo off
SET /a start=%1

call :sub1


:sub1

SET /a end=254
SET /a end=%end%-%start%
SET /a start=%start%-1

FOR /L %%i IN (1,1,%end%) DO call :sub2 %%i
goto :ende
	
:sub2

rem echo i=%1
SET /a ip=0
SET /a ip=%start%+%1
ping -n 1  -w 1000 172.16.11.%ip%
if errorlevel 1 ( echo 172.16.11.%ip% >> c:\temp\terminals_fail.txt)
rem pause
goto :ende


:ende



HaHa...
Bevor ich zum Veröffentlichen gekommen bin, hab ich den Fehler erkannt...
Der Aufruf von sub1!
Auskommentiert und es läuft nur noch einmal durch.

rem call :sub1

rem :sub1

Allerdings verstehe ich nicht warum!
Gut , ich brauche keine sub an der Stelle, dehalb auch der Versuch. Aber wieseo führt das zu einer doppelten Ausführung?
Wenn mir das ein Crack erklären kann, wäre ich sehr dankbar! Und hätte wieder was dazu gelernt...

Content-ID: 647097

Url: https://administrator.de/forum/for-schleife-wird-2mal-durchlaufen-647097.html

Ausgedruckt am: 13.04.2025 um 13:04 Uhr

MrCount
Lösung MrCount 02.02.2021 um 15:06:25 Uhr
Goto Top
Servus,

klar: https://docs.microsoft.com/de-de/windows-server/administration/windows-c ...


Using the <label> parameter:

By using call with the <label> parameter, you create a new batch file context and pass control to the statement after the specified label. The first time the end of the batch file is encountered (that is, after jumping to the label), control returns to the statement after the call statement. The second time the end of the batch file is encountered, the batch script is exited.
TK1987
Lösung TK1987 02.02.2021 um 15:08:10 Uhr
Goto Top
Moin,

Zitat von @CMOS78:
Allerdings verstehe ich nicht warum!
Gut , ich brauche keine sub an der Stelle, dehalb auch der Versuch. Aber wieseo führt das zu einer doppelten Ausführung?
na wieso wohl. Guck dir mal genau an, was der Unterschied zwischen goto und call ist. Goto springt zu einem bestimmten Punkt. Call hingegegen ruft einen Bereich ab der Sprungmarke auf und kehrt anschließend wieder zum Ausgangspunkt zurück.

Gruß Thomas
Pjordorf
Lösung Pjordorf 02.02.2021 aktualisiert um 15:16:42 Uhr
Goto Top
Hallo,

Zitat von @CMOS78:
Bevor ich zum Veröffentlichen gekommen bin, hab ich den Fehler erkannt...
Allerdings verstehe ich nicht warum!
Spiele einfach mal Processor und arbeite deine Batchdatei ab, Zeile für Zeile...Das du mal ein Call verwendest und mal nicht ist eher unerheblich. Du Rufst Sub1 auf und danach nochmal. Das macht also 2 mal hintereinander. Was soll denn sonst passieren wenn du ohne Bedingungen oder Sprungmarken so Arbeitest. Works as designed. face-smile

Man könnte auch
1
2
3
4
5
6
call :sub1

Goto istnurneSprungmarke
:sub1

:IstnurneSprungmarke 
Schreiben.

Gruß,
Peter
Lochkartenstanzer
Lochkartenstanzer 02.02.2021 aktualisiert um 16:48:35 Uhr
Goto Top
Zitat von @CMOS78:

rem call :sub1

rem :sub1

Allerdings verstehe ich nicht warum!

moin,

Weil Du das hingeschrieben hast. face-smile

Einmal läuft er über den Call, kommt zurück und läuft halt nochmal rein. Wenn Du das nicht willst. muß Du hinter dem Call ein goto hinschreiben.

lks
CMOS78
CMOS78 06.02.2021 um 21:22:37 Uhr
Goto Top
Ja, Danke! Der Unterschied zwischen call und goto... Hab ich was dazu gelernt!
Kannte ich bis dato nicht...
Merci