# batch loop mit counter und goto zählt nicht richtig



## ngedigk (26. August 2013)

Hallo zusammen,

ich bitte um eure Mithilfe für folgenden Code:

```
@echo off

	:nochmal
		cls
		echo.|set /p ="Schleifen-Durchläufe: "
		set /p maxschleife=""
		set /a counter=1

	:start
		echo counter: %counter%
		set /a counter+=1
		if %counter% lss %maxschleife%+1 goto start

	echo.|set /p ="Nochmal [j/n]: "
	set /p nochmal=""
	if "%nochmal%"=="j" goto :nochmal
	if "%nochmal%"=="n" goto :eof
	
pause
```

Das man solche Schleifen auch mit einer for-Schleife machen kann ist mir klar. Aber in einem bestimmten Fall brauche ich solche Sprungmarken. Ich bin etwas raus, weil ich ewig nicht mit bat-Dateien gearbeitet habe.

Testet den Code mal bitte aus.
Wenn ich für %maxschleife% 1,2,3,4,5,6,7,8 eingebe geht noch alles klar.

*Wenn ich 9 eingebe, zählt es bis 89
Bei 10-19 zählt es nur bis 1
Bei 20-29 zählt es bis 2 etc.
Bei 99 zählt es bis 989*

Was ist da los?


----------



## deepthroat (27. August 2013)

Hi.

Was da genau vor sich geht, siehst du ganz einfach indem du echo of ON stellst. 

Bei der Operation LSS wird ein _Stringvergleich_ durchgeführt, und es wird auch nicht der Wert von %maxschleife%+1 berechnet, sondern mit "N+1" als String verglichen.

Bei 1,2,3,4,5,6,7,8 funktioniert das noch gut, da du nur eine Dezimalstelle hast, bei maxschleife = 9, werden aber zwei Dezimalstellen verglichen, also z.B. ob 10 LSS 9+1 ist -- als String! Da die 1 < 9 ist, ist der Test bereits wahr.

Erst beim Vergleich 90 LSS 9+1 wird die Schleife gestoppt, da 9 nicht kleiner 9 ist, und 0 größer als + ist (laut ASCII Tabelle).

Wäre jetzt die Frage warum du überhaupt Sprungmarken verwenden willst, vermutlich geht es einfach mit einer Zählschleife.


----------



## ngedigk (27. August 2013)

Danke für diese ausführliche und gut verständliche Erklärung! 

Mir leuchtet folgendes trotzdem nicht ein:


> Bei der Operation LSS wird ein *Stringvergleich *durchgeführt



Warum wird da ein Stringvergleich  gemacht. Ich wollte gern einen Numerischen Vergleich ... 
Muss ich also offensichtlich eine andere IF Bedingung finden, die das kontrolliert.

*Warum ich keine Zählschleife verwende:*
Klar ist sicher, dass das da oben nur ein Beispiel ist.
Soweit mein Kenntnisstand reicht, kann ich die Variablen die innerhalb der for-Schleife verwendet werden, nicht mehr außerhalb derselben verwenden, war das nicht so? Ich würde aber sogar mehrere for-Schleifen miteinander schachteln müssen.

*Kurze Erklärung zum Anwendungsgebiet:*

Es sollen schlussendlich mehrere txt-Dateien, mit variablen Inhalten erzeugt werden.
Dafür werden diverse Benutzerabfragen zu folgendem gemacht.
Es existiert ein Satz mit variabler Anzahl von PDF-Dateien (Linien genannt). Die Anzahl der Linien, wie auch folgende Details werden vom Benutzer eingegeben.
Für Jede Linie wird ein Name vergeben.
Jede Linie hat unterschiedliche Seitenzahlen.
Davon sind einige Seiten Doppelseiten (1 Blatt = 2 Seiten); andere Seiten sind einseitig.
Es werden noch viele weitere Dinge zu jeder einzelnen PDF des gesamten Satzes abgefragt.
Es werden auch nicht nur numerische Eingaben verarbeitet. Auch Strings werden erfasst. So zum Beispiel ob ein Text an einer bestimmten Stelle *aller* Seiten *aller* PDF weiß oder schwarz dargestellt ist.
Egal was es noch für Abfragen geben mag, alle erfassten Variablen sollen in einer Sammel-txt-Datei erfasst werden.
Anschließend sollen aus dieser Sammel-txt-Datei nach bestimmten Kriterien diverse einzel-txt-Datei erstellt werden, indem diese Variablen ausgelesen werden.


----------



## deepthroat (27. August 2013)

ngedigk hat gesagt.:


> Mir leuchtet folgendes trotzdem nicht ein:
> 
> Warum wird da ein Stringvergleich  gemacht.


Weil das so definiert ist (siehe "help if")


ngedigk hat gesagt.:


> Ich wollte gern einen Numerischen Vergleich ...


Das ist nicht verhandelbar. ;-)


ngedigk hat gesagt.:


> Muss ich also offensichtlich eine andere IF Bedingung finden, die das kontrolliert.
> 
> *Warum ich keine Zählschleife verwende:*
> Klar ist sicher, dass das da oben nur ein Beispiel ist.
> Soweit mein Kenntnisstand reicht, kann ich die Variablen die innerhalb der for-Schleife verwendet werden, nicht mehr außerhalb derselben verwenden, war das nicht so?


Ich weiß nicht genau was du meinst, aber mir fallen da keine besonderen Beschränkungen ein.


ngedigk hat gesagt.:


> Ich würde aber sogar mehrere for-Schleifen miteinander schachteln müssen.


Das ist OK.


ngedigk hat gesagt.:


> *Kurze Erklärung zum Anwendungsgebiet:*
> 
> Es sollen schlussendlich mehrere txt-Dateien, mit variablen Inhalten erzeugt werden.
> Dafür werden diverse Benutzerabfragen zu folgendem gemacht.
> ...


Klingt auf jeden Fall so, als würdest du mit Zählschleifen und "Subroutinen" besser fahren als mit wildem Herumgespringe.


----------



## ngedigk (27. August 2013)

okay, dann mach ich mich mal ran und geh das mal so wie du es sagst durch ...

Danke dir für deine Antworten bis hierher.

Was wäre zu meiner Annahme hier zu sagen?


> Soweit mein Kenntnisstand reicht, kann ich die Variablen die innerhalb der for-Schleife verwendet werden, nicht mehr außerhalb derselben verwenden, war das nicht so?


----------



## deepthroat (27. August 2013)

ngedigk hat gesagt.:


> Was wäre zu meiner Annahme hier zu sagen?
> 
> 
> 
> ...


Wie gesagt, ich weiß nicht genau was du da meinst. Evtl. das eine Schleifenvariable immer nur aus einem Buchstaben besteht und dementsprechend max. 26 Schleifen geschachtelt werden könnnen, aber wer will das schon... Andere Variablen kann man problemlos in inneren und äußeren Schleifen verwenden.


----------



## ngedigk (27. August 2013)

Okay, seltsam, ich war der Meinung das gelesen zu haben und war auch der Überzeugung, dass ich damit tatsächlich auch Probleme hatte und deshalb zu Sprungmarken gewechselt war.



> Evtl. das eine Schleifenvariable immer nur aus einem Buchstaben besteht und dementsprechend max. 26 Schleifen geschachtelt werden könnnen, aber wer will das schon...



Soviele verschachtelungen brauche ich nun auch wieder nicht. ;-)

Also gut, wie schon gesagt werde ich das ganze einfach neu aufrollen.


----------

