batch loop mit counter und goto zählt nicht richtig

#1
Hallo zusammen,

ich bitte um eure Mithilfe für folgenden Code:
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? :(
 
Zuletzt bearbeitet:

deepthroat

Erfahrenes Mitglied
#2
Hi.

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

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.
 
#3
Danke für diese ausführliche und gut verständliche Erklärung! :D

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 ... :rolleyes:
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.
 
Zuletzt bearbeitet:

deepthroat

Erfahrenes Mitglied
#4
Mir leuchtet folgendes trotzdem nicht ein:

Warum wird da ein Stringvergleich gemacht.
Weil das so definiert ist (siehe "help if")
Ich wollte gern einen Numerischen Vergleich ... :rolleyes:
Das ist nicht verhandelbar. ;-)
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.
Ich würde aber sogar mehrere for-Schleifen miteinander schachteln müssen.
Das ist OK.
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.
Klingt auf jeden Fall so, als würdest du mit Zählschleifen und "Subroutinen" besser fahren als mit wildem Herumgespringe.
 
#5
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

Erfahrenes Mitglied
#6
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?
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.
 
#7
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.
 

Neue Beiträge