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-ID: 92371

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

Ausgedruckt am: 22.11.2024 um 22:11 Uhr

bastla
bastla 18.07.2008 um 15:23:10 Uhr
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
DexXxtrin
DexXxtrin 18.07.2008 um 15:35:53 Uhr
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)
bastla
bastla 18.07.2008 um 17:29:47 Uhr
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.
miniversum
miniversum 18.07.2008 um 17:40:13 Uhr
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.
DexXxtrin
DexXxtrin 18.07.2008 um 18:58:52 Uhr
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.
DexXxtrin
DexXxtrin 18.07.2008 um 18:59:44 Uhr
Goto Top
Kannst du mir diese Datei mal erklären, da ich den Durchblich nicht gerade habe?
bastla
bastla 18.07.2008 um 20:31:37 Uhr
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
DexXxtrin
DexXxtrin 18.07.2008 um 21:47:12 Uhr
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
bastla
bastla 18.07.2008 um 21:53:52 Uhr
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
DexXxtrin
DexXxtrin 18.07.2008 um 22:05:01 Uhr
Goto Top
Hallo bastla!
Vielen dank für deine Hilfe!!!
Es funktioniert perfekt!

Gruss DexXxtrin
miniversum
miniversum 19.07.2008 um 09:52:43 Uhr
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.
DexXxtrin
DexXxtrin 19.07.2008 um 10:45:40 Uhr
Goto Top
Das würde bedeuten, dass ich für alle zweistelligen Zahlen ca. 12'100 REM DATA Zeilen eingeben müsste...?! (Basis 110)
miniversum
miniversum 19.07.2008 um 10:50:23 Uhr
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 
DexXxtrin
DexXxtrin 19.07.2008 um 20:34:03 Uhr
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!