dexxxtrin
Goto Top

Batch - Spezielle FOR zählweise

Hallo zusammen

Ich möchte mit der FOR Schleife eine spezielle "Zählfolge" verwenden.
Nun ist die Frage, ob dies überhaupt möglich ist:

Die Zählvolge sollte nicht nur von 1-9 zählen, sondern auch Buchstaben und Sonderzeichen beinhalten.

Das würde dann etwa so aussehen:

0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,ä,ö,ü,-,_,...
und dann 01,02,03,04,05,06,07,08,...

Ist dies möglich und wenn ja, wie?
Sonst, gibt es eine andere Möglichkeit um so etwas zu realisieren?

Hoffe ihr könnt mir helfen.

Gruss DexXxtrin

Content-Key: 92371

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

Printed on: April 23, 2024 at 21:04 o'clock

Member: bastla
bastla Jul 18, 2008 at 13:23:10 (UTC)
Goto Top
Hallo DexXxtrin!

In Batch ist vieles möglich, aber vielleicht holt Du etwas weiter aus und erklärst kurz, wie/wozu Du diesen "Zähler" verwenden willst ...

Außerdem ist mir die Fortsetzung mit "01,02,..." nicht klar - eigentlich müsste das "10,11,..." sein, bzw sollten, bei Verwendung von führenden Nullen, von Vornherein alle "Zahlen" die gleiche Stellenanzahl aufweisen.

Und: Welche Basis (Anzahl unterschiedlicher "Ziffern") willst Du verwenden?

Grüße
bastla
Member: DexXxtrin
DexXxtrin Jul 18, 2008 at 13:35:53 (UTC)
Goto Top
Eine Führende Null spielt auch eine Rolle, da es auf die Anzahlt Zeichen ankommt.
Die Zählweise wäre so:
0,1,2,...,a,b,c,...,+,",*,...
00,01,02,...,0a,0b,0c,...,0+,0",0*,...
10,11,12,...,1a,1b,1c,...,1+,1",1*,...

dann
000,001,002...,00a,00b,00c,...,00+,00",00*,...

Die Basis wäre dann etwa 116 mit allen Sonderzeichen und Buchstaben (gross und klein)
Member: bastla
bastla Jul 18, 2008 at 15:29:47 (UTC)
Goto Top
Hallo DexXxtrin!

Eigentlich wird bei Dir die Ziffer "0" als 1 verwendet, beim Übergang auf die zweite Stelle allerdings auch wieder als 0 (ansonsten müsste die erste zweistellige Zahl zB "0~" - wenn "~" die erste/letzte Ziffer Deines Vorrates wäre - lauten).
Als Beispiel, wie es grundsätzlich gehen könnte, ein Versuch mit der Basis 20 (Ziffern "0"-"9", Buchstaben "a"-"j"):
@echo off & setlocal enabledelayedexpansion
set "Ziffern=0123456789abcdefghij"  
set /a Basis=20
for /l %%i in (0,1,500) do call :Codierung %%i & echo !Zahl!
goto :eof

:Codierung
set Rest=%1
set Zahl=
:Loop
set /a Stelle=%Rest%%%Basis%
set "Zahl=!Ziffern:~%Stelle%,1!%Zahl%"  
set /a Rest=%Rest%/%Basis%
if %Rest% gtr 0 goto :Loop
goto :eof
Das Unterprogramm ":Codierung" wird mit Übergabe der laufenden Zahl (als Dezimalzahl) aufgerufen und erzeugt deren Pendant im "20er-System" in der Variablen %Zahl%.

Um den jeweils aktuellen Wert dieser Variablen innerhalb der Schleife ausgeben zu können, ist anstelle von %Zahl% die Schreibweise !Zahl! zu verwenden (Stichwort "delayedExpansion"), was bereits ein erster Hinweis auf eine Besonderheit/Problematik bei der Umsetzung in einem Batch ist - "!" gilt hier als Sonderzeichen und eignet sich daher genauso wenig als Bestandteil des Ziffernvorrates wie etwa das Anführungszeichen, "|", "&" sowie einige weitere Zeichen.

Welche Zeichen für Deine Anwendung (welche immer das auch sein mag) nötig und in Batch verwendbar sind, wirst Du selbst feststellen müssen.

Grüße
bastla

P.S.: Um die Ausgabe besser nachvollziehen zu können, solltest Du den Batch von der Kommandozeile aus starten und ein ">D:\Textdatei.txt" anfügen, damit die Zahlen in die angegebene Datei geschrieben werden und Du sie Dir mit einem Editor ansehen kannst. Alternativ dazu kannst du auch am Ende der Zeile 4
>>D:\Textdatei.txt
hinzufügen - in diesem Fall müsstest du am Anfang auch noch mit
del D:\Textdatei.txt 2>nul
jeweils die Ausgabedatei löschen.
Member: miniversum
miniversum Jul 18, 2008 at 15:40:13 (UTC)
Goto Top
Versuchs mal mit folgendes Batch:
@echo off
FOR /F "tokens=3* delims= " %%i in ('findstr /B "REM DATA" %0') do echo %%i  

REM DATA 0 
REM DATA 1 
REM DATA 2 
REM DATA 3 
REM DATA 4 
REM DATA 5 
REM DATA 6 
REM DATA 7 
REM DATA 8 
REM DATA 9 
REM DATA a 
REM DATA b 
REM DATA c 
REM DATA d 
REM DATA e 
REM DATA f 
REM DATA g 
REM DATA h 
REM DATA i 
REM DATA j 
REM DATA k 
REM DATA l 
REM DATA m 
REM DATA n 
REM DATA o 
REM DATA p 
REM DATA q 
REM DATA r 
REM DATA s 
REM DATA t 
REM DATA u 
REM DATA v 
REM DATA w 
REM DATA x 
REM DATA y 
REM DATA z 

Die Reihe kannst du beliebeig fortsetzen.
Member: DexXxtrin
DexXxtrin Jul 18, 2008 at 16:58:52 (UTC)
Goto Top
Vielen Dank für deine Hilfe!
Diese Variante Funktioniert perfekt!
Es gehen auch alle Sonderzeichen ausser ", da das Schlusszeichen für das Ende der Zeichendefinition gebraucht wird.
Member: DexXxtrin
DexXxtrin Jul 18, 2008 at 16:59:44 (UTC)
Goto Top
Kannst du mir diese Datei mal erklären, da ich den Durchblich nicht gerade habe?
Member: bastla
bastla Jul 18, 2008 at 18:31:37 (UTC)
Goto Top
Hallo DexXxtrin!

Die erwähnten Probleme mit den Sonderzeichen waren auf eine Weiterverarbeitung der erstellten "Nummer" bezogen - wenn allerdings letztere, so wie in meinem Beispiel, nur per "echo" ausgegeben werden soll, könntest Du sogar ein Anführungszeichen verwenden (allerdings nur als letztes Zeichen):
set "Ziffern=0123456789abcdefghi"""  
Grüße
bastla
Member: DexXxtrin
DexXxtrin Jul 18, 2008 at 19:47:12 (UTC)
Goto Top
Hallo bastla
Bei der Weiterverarbeitung wie ich sie mache, wird es keine Probleme geben.
Aber wiso hast du am schluss 3 Schlusszeichen?
Ich nehme an, mit dem ersten wird der set Befehl geschlossen, was machen dann die anderen beinden noch?

Guss DexXxtrin
Member: bastla
bastla Jul 18, 2008 at 19:53:52 (UTC)
Goto Top
Hallo DexXxtrin!
... was machen dann die anderen beinden noch?
Durch die Verdoppelung kannst Du ein (einzelnes) Anführungszeichen in den String aufnehmen - da allerdings für jedes Zeichen nur eine Stelle vorgesehen ist, muss das Anführungszeichen am Ende des Strings stehen.

Grüße
bastla
Member: DexXxtrin
DexXxtrin Jul 18, 2008 at 20:05:01 (UTC)
Goto Top
Hallo bastla!
Vielen dank für deine Hilfe!!!
Es funktioniert perfekt!

Gruss DexXxtrin
Member: miniversum
miniversum Jul 19, 2008 at 07:52:43 (UTC)
Goto Top
Die Batch sucht in ihr selbst nach den Zeilen die mit "REM DATA" beginnen. Alles was nach "REM DATA " kommt wird dann ausgegeben. Du kannst also jeden Text dahinter schreiben.
Member: DexXxtrin
DexXxtrin Jul 19, 2008 at 08:45:40 (UTC)
Goto Top
Das würde bedeuten, dass ich für alle zweistelligen Zahlen ca. 12'100 REM DATA Zeilen eingeben müsste...?! (Basis 110)
Member: miniversum
miniversum Jul 19, 2008 at 08:50:23 (UTC)
Goto Top
Du könntest auch zwei schleifenmachen udn diese Kombinieren:
@echo off
FOR /F "tokens=3* delims= " %%i in ('findstr /B "REM DATA" %0') do (  
FOR /F "tokens=3* delims= " %%j in ('findstr /B "REM DATA" %0') do echo %%i%%j  
)
REM DATA 
REM DATA 0 
REM DATA 1 
REM DATA 2 
REM DATA 3 
REM DATA 4 
REM DATA 5 
REM DATA 6 
REM DATA 7 
REM DATA 8 
REM DATA 9 
REM DATA a 
REM DATA b 
REM DATA c 
REM DATA d 
REM DATA e 
REM DATA f 
REM DATA g 
REM DATA h 
REM DATA i 
REM DATA j 
REM DATA k 
REM DATA l 
REM DATA m 
REM DATA n 
REM DATA o 
REM DATA p 
REM DATA q 
REM DATA r 
REM DATA s 
REM DATA t 
REM DATA u 
REM DATA v 
REM DATA w 
REM DATA x 
REM DATA y 
REM DATA z 
Member: DexXxtrin
DexXxtrin Jul 19, 2008 at 18:34:03 (UTC)
Goto Top
Vielen Dank schon mal für deine Hilfe bis hier hin.
Noch eine Frage:
Kann ich auch 3 oder noch mehrere zusammenhängen?

So funktioniert es nicht:
@echo off

FOR /F "tokens=3 delims= " %%i in ('findstr /B "REM DATA" %0') do (  
FOR /F "tokens=3 delims= " %%j in ('findstr /B "REM DATA" %0') do (  
FOR /F "tokens=3 delims= " %%k in ('findstr /B "REM DATA" %0') do echo %%i%j%%k  
)
)

REM DATA 
REM DATA 0 
REM DATA 1 
REM DATA 2 
REM DATA 3 
REM DATA 4 
REM DATA 5 
REM DATA 6 
REM DATA 7 
REM DATA 8 
REM DATA 9 
REM DATA a 
REM DATA b 
REM DATA c 
REM DATA d 
REM DATA e 
REM DATA f 
REM DATA g 
REM DATA h 
REM DATA i 
REM DATA j 
REM DATA k 
REM DATA l 
REM DATA m 
REM DATA n 
REM DATA o 
REM DATA p 
REM DATA q 
REM DATA r 
REM DATA s 
REM DATA t 
REM DATA u 
REM DATA v 
REM DATA w 
REM DATA x 
REM DATA y 
REM DATA z

Bis zweistellig funktioniert es so, aber danach wird nur noch 0k ausgegeben (weiss nicht wie viele male) und dann 1k.
Der Sinn wäre aber, dass es 000,001,.... ausgibt...

EDIT:

Sry mein Fehler:

Habe ein % vergessen bei der dritten FOR Schleife vor dem j!
Klappt alles perfekt!
Vielen Dank!