Zwei verschachtelte for-Schleifen
Hallo zusammen!
Ich leider gleich einen Berg Probleme.
Hier der Inhalt meiner Dateien:
Code.bat:
Die Zeilen 4 und 5 würde ich wenn alles funktioniert für alle anderen Buchstaben und Zeichen wiederholen.
Also etwa:
Damit soll erreicht werden, dass jedes Zeichen durch ein bestimmtes anderes Zeichen ersetzt wird.
(z.B. a durch das erste in der Datei Alphabet.txt b durch das zweite ...)
Die Datei Alphabet.txt enthält:
Pro Zeile ist immer ein Zeichen, jedes Zeichen kommt nur einmal vor.
Die Reihenfolge ist dabei verschieden.
Die Datei split.txt enthält dieselben Zeichen jedoch nicht immer alle und in nicht definierter Anzahl.
Sie wird von der Datei Split.bat erzeugt.
Split.bat:
Die Datei ktext.txt enthält einen einzeiligen Text aus den vorhin schon genannten Zeichen.
Die Datei Split.bat soll nun jedes Zeichen in eine neue Zeile schreiben, womit ich schon das erste Problem hätte. Alles funktioniert zwar wunderbar, jedoch musste ich die Leerzeichen in ktext.txt durch "_" ersetzen, da die Datei sonst immer in split.txt schrieb:
"ECHO ist eingeschaltet (ON).".
Das zweite Problem ist in der Datei Code.bat. Sie schreibt leider nichts in die Datei ctest.txt, auch wenn das Zeichen in split.txt ein A ist.
Sie kapiert aber dass ein a in der split.bat steht denn sie wartet nach jedem a auf einen Tastendruck. Leider werde ich aus dem Text, der beim ausführen von Code.bat ausgegeben wird, nicht so schlau.
Der Text wäre:
Was ich nicht verstehe ist, warum der Befehl "@echo %%J>>ctest.txt" weder angezeigt noch ausgeführt wird. Das andere was mich wundert ist wieso " " delims="" ist syntaktisch an dieser Stelle nicht verarbeitbar. " nur jeweils beim letzen mal vor dem pause-Befehl angezeigt wird.
LG
Mathe172
Ich leider gleich einen Berg Probleme.
Hier der Inhalt meiner Dateien:
Code.bat:
@echo on & setlocal enabledelayedexpansion
pause
for /F "delims=" %%I in (split.txt) do (
if %%I==a (
for /f "skip=0 delims=" %%J in (alphabet.txt) do (
@echo %%J>>ctest.txt
break
)
pause
)
)
pause
Also etwa:
if %%I==a (
for /f "skip=0 delims=" %%J in (alphabet.txt) do (
if %%I==b (
for /f "skip=1 delims=" %%J in (alphabet.txt) do (
if %%I==c (
for /f "skip=2 delims=" %%J in (alphabet.txt) do (
.
.
.
if %%I==8 (
for /f "skip=35 delims=" %%J in (alphabet.txt) do (
if %%I==9 (
for /f "skip=36 delims=" %%J in (alphabet.txt) do (
(z.B. a durch das erste in der Datei Alphabet.txt b durch das zweite ...)
Die Datei Alphabet.txt enthält:
- die Grossbuchstaben von A-Z
- die Zahlen von 0-9
- das Zeichen _
Pro Zeile ist immer ein Zeichen, jedes Zeichen kommt nur einmal vor.
Die Reihenfolge ist dabei verschieden.
Die Datei split.txt enthält dieselben Zeichen jedoch nicht immer alle und in nicht definierter Anzahl.
Sie wird von der Datei Split.bat erzeugt.
Split.bat:
@echo on & setlocal enabledelayedexpansion
for /F "delims=" %%I in (ktext.txt) do set text=%%I
set /a stellen_split=0
:loop_split
set "char_split=!text:~%stellen_split%,1!"
if "%char_split%"=="" goto :weiter_split
echo "%char_split%">>split2.txt
set /a stellen_split+=1
goto :loop_split
:weiter_split
if exist "split.txt" del "split.txt"
for /F "delims=" %%I in (split2.txt) do @echo %%~I>>"split.txt"
del "split2.txt"
pause
Die Datei ktext.txt enthält einen einzeiligen Text aus den vorhin schon genannten Zeichen.
Die Datei Split.bat soll nun jedes Zeichen in eine neue Zeile schreiben, womit ich schon das erste Problem hätte. Alles funktioniert zwar wunderbar, jedoch musste ich die Leerzeichen in ktext.txt durch "_" ersetzen, da die Datei sonst immer in split.txt schrieb:
"ECHO ist eingeschaltet (ON).".
Das zweite Problem ist in der Datei Code.bat. Sie schreibt leider nichts in die Datei ctest.txt, auch wenn das Zeichen in split.txt ein A ist.
Sie kapiert aber dass ein a in der split.bat steht denn sie wartet nach jedem a auf einen Tastendruck. Leider werde ich aus dem Text, der beim ausführen von Code.bat ausgegeben wird, nicht so schlau.
Der Text wäre:
C:\Bat >pause
Drücken sie eine beliebige Taste...
C:\Bat >for /F "delims=" %I in (split.txt) do (if %I == a (
for /F "skip=0 delims=" %J in (alphabet.txt) do (
break
)
pause
) )
C:\Bat >(if m == a (
for /F "skip=0 delims=" %J in (alphabet.txt) do (
break
)
pause
) )
C:\Bat >(if a == a (
for /F "skip=0 delims=" %J in (alphabet.txt) do (
break
)
pause
) )
" delims="" ist syntaktisch an dieser Stelle nicht verarbeitbar.
Drücken sie eine beliebige Taste...
Was ich nicht verstehe ist, warum der Befehl "@echo %%J>>ctest.txt" weder angezeigt noch ausgeführt wird. Das andere was mich wundert ist wieso " " delims="" ist syntaktisch an dieser Stelle nicht verarbeitbar. " nur jeweils beim letzen mal vor dem pause-Befehl angezeigt wird.
LG
Mathe172
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 145195
Url: https://administrator.de/forum/zwei-verschachtelte-for-schleifen-145195.html
Ausgedruckt am: 22.12.2024 um 01:12 Uhr
11 Kommentare
Neuester Kommentar
Hallo mathe172 und willkommen im Forum!
Zu "ECHO ist eingeschaltet (ON).":
Ändere die Zeile 12 auf
Schwieriger wird schon, was Du mit der "code.bat" vorhast - um tatsächlich für "a" das 1. und für "f" das 6. Zeichen aus der "alphabet.txt" zu holen, wird die Schleifenkonstruktion so nicht funktionieren, da zwar immer an der richtigen Stelle angefangen würde (außer für das "a", da "
Abgesehen davon, dass es einfacher wäre, alle Zeichen der "alphabet.txt" in eine Variable %alphabet% zu schreiben und dann nur noch einen 1 Zeichen langen Teilstring daraus (ab der jeweils richtigen Position) zu verwenden, also etwa:
sind das ja alles nur technische Fragen zu Deinem bisherigen Ansatz (der vermutich noch Optimierungspotenzial hat); was willst Du denn eigentlich im Endeffekt erreichen (bzw wie sähe der "Vorher-Nachher"-Vergleich aus)?
Grüße
bastla
warum der Befehl "@echo %%J>>ctest.txt" weder angezeigt noch ausgeführt wird.
Zumindest Teil 1 der Frage ist leicht zu beantworten: Ein "@" vor dem Befehl verhindert, dass dieser angezeigt wird (hast Du Dich noch nie gefragt, warum das zumeist vor dem "echo off
" am Anfang eines Batches verwendet wird?) ...Zu "ECHO ist eingeschaltet (ON).":
Ändere die Zeile 12 auf
for /F "delims=" %%I in (split2.txt) do @echo\%%~I>>"split.txt"
Schwieriger wird schon, was Du mit der "code.bat" vorhast - um tatsächlich für "a" das 1. und für "f" das 6. Zeichen aus der "alphabet.txt" zu holen, wird die Schleifenkonstruktion so nicht funktionieren, da zwar immer an der richtigen Stelle angefangen würde (außer für das "a", da "
skip=0
" den zitierten Syntaxfehler liefert), aber die Schleife läuft ja immer bis zur letzten Zeile der "alphabet.txt" durch ...Abgesehen davon, dass es einfacher wäre, alle Zeichen der "alphabet.txt" in eine Variable %alphabet% zu schreiben und dann nur noch einen 1 Zeichen langen Teilstring daraus (ab der jeweils richtigen Position) zu verwenden, also etwa:
for /F "delims=" %%I in (split.txt) do (
if %%I==a echo %alphabet:~0,1%
if %%I==b echo %alphabet:~1,1%
if %%I==c echo %alphabet:~2,1%
if %%I==d echo %alphabet:~3,1%
if %%I==e echo %alphabet:~4,1%
if %%I==f echo %alphabet:~5,1%
if %%I==_ echo %alphabet:~36,1%
)>>ctest.txt
pause
goto :eof
Grüße
bastla
Hallo mathe172!
können auch einige weitere Zeichen (zu denen neben "\" etwa auch "," oder "+" gehören) dazu verwendet werden, eine Leerzeile zu erzeugen oder eben eine Zeile mit einem oder mehreren Leerzeichen ...
Grüße
bastla
Ist das mit dem @echo\.. Befehl eine Art Parameter der das Schreiben von Leerzeichen in Datein ermöglicht?
Neben dem "klassischen"echo.
Geht das so dass man das >>ctest.txt nach der Klammer schreiben kann?
Ich konnte das vorhin - und eigentlich egal, was ich jetzt antworte: entweder Du glaubst mir das (das hättest Du ja schon tun können), oder, besser, Du testest es einfach ...Und zu deiner Frage was das ganze soll, ich will mithilfe von einstellbaaren Zahlen einen Schlüssel und die Buchstabenreihenfolge im Alphabet.txt(oder halt in der Variable) errechnen. Mit diesem Alphabet soll er nun einen Text verschlüsseln/entschlüsseln.
Eigentlich hatte ich (auch) gemeint, ob das gewünschte Ergebnis tatsächlich eine Datei mit zeilenweise angeordneten Zeichen sein soll ...Grüße
bastla
Hallo mathe172!
Du willst also eigentlich aus einer Zeile (in der Datei "ktext.txt") eine andere (codierte) Zeile erzeugen und in "ctest.txt" schreiben, wobei die Zuordnung der Zeichen aus der Datei "alphabet.txt" gelesen werden soll - wenn ja, dann wären die "split.bat" und die "split.txt" entbehrlich, und ein an Deinen Entwurf angelehnter Ansatz könnte so aussehen:
Die eingerückten "
Ich habe die einzelnen Zeichen der "alphabet.txt" der Einfachheit halber in einer einzigen Zeile zusammengefasst - der Dateiinhalt sähe dann zB so aus:
Soferne die "alphabet.txt" auch so aussehen dürfte (ich habe sie in diesem Format "match.txt" genannt):
fände ich
etwas eleganter ...
Grüße
bastla
Du willst also eigentlich aus einer Zeile (in der Datei "ktext.txt") eine andere (codierte) Zeile erzeugen und in "ctest.txt" schreiben, wobei die Zuordnung der Zeichen aus der Datei "alphabet.txt" gelesen werden soll - wenn ja, dann wären die "split.bat" und die "split.txt" entbehrlich, und ein an Deinen Entwurf angelehnter Ansatz könnte so aussehen:
@echo off & setlocal
set "CodeFile=ctest.txt"
set /p Text=<ktext.txt
set /p Alpha=<alphabet.txt
set "Char=abcdefghijklmnopqrstuvwxyz0123456789 "
echo %Text%
echo %Alpha%
set "Code="
:Loop
if "%Text%"=="" goto :Done
set "Char=%Text:~,1%"
echo\%Char%
if "%Char%"=="a" set "Code=%Code%%Alpha:~0,1%"
if "%Char%"=="b" set "Code=%Code%%Alpha:~1,1%"
if "%Char%"=="c" set "Code=%Code%%Alpha:~2,1%"
if "%Char%"=="d" set "Code=%Code%%Alpha:~3,1%"
if "%Char%"=="e" set "Code=%Code%%Alpha:~4,1%"
if "%Char%"=="f" set "Code=%Code%%Alpha:~5,1%"
...
if "%Char%"==" " set "Code=%Code%%Alpha:~36,1%"
set "Text=%Text:~1%"
echo\%Text%
echo\%Code%
goto :Loop
:Done
>"%CodeFile%" echo\%Code%
echo
"-Zeilen sind für das Debuggen/Nachvollziehen gedacht.Ich habe die einzelnen Zeichen der "alphabet.txt" der Einfachheit halber in einer einzigen Zeile zusammengefasst - der Dateiinhalt sähe dann zB so aus:
2JOCXSAT3U5VN1FMGQKZR0P68WD7Y9HIE 4BL
Soferne die "alphabet.txt" auch so aussehen dürfte (ich habe sie in diesem Format "match.txt" genannt):
a=2
b=J
c=O
d=C
e=X
f=S
g=A
h=T
i=3
j=U
k=5
l=V
m=N
n=1
o=F
p=M
q=G
r=Q
s=K
t=Z
u=R
v=0
w=P
x=6
y=8
z=W
0=D
1=7
2=Y
3=9
4=H
5=I
6=E
7=_
8=4
9=B
=L
@echo off & setlocal
set "CodeFile=ctest.txt"
set /p Text=<ktext.txt
set "Match=match.txt"
echo %Text%
set "Code="
:Loop
if "%Text%"=="" goto :Done
set "Char=%Text:~,1%"
for /f "tokens=1-2 delims==" %%i in ('findstr "%Char%=" "%Match%"') do set "CodeChar=%%j"
if not defined CodeChar (echo "%Char%" nicht gefunden! & goto :eof)
set "Code=%Code%%CodeChar%"
set "Text=%Text:~1%"
echo\%Text%
echo\%Code%
goto :Loop
:Done
>"%CodeFile%" echo\%Code%
Grüße
bastla
Hallo mathe172!
In der Variablen %CodeChar% landet alles, was in der letzten Zeile, welche "gesuchtes Zeichen=" enthält, nach dem "=" steht - bei korrekter "match.txt" ist das dann genau eine Zeile.
Grüße
bastla
Könntest du mir bitte die Funktionsweise
von den "" beim set-Befehl,
Durch das Setzen dieser Anführungszeichen wird zB vernindert, dass unbeabsichtigt ein oder mehrere Leerzeichen am Ende der Zeile mit in den Variableninhalt aufgenommen werden - muss daher nicht unbedingt sein, schadet aber idR nicht ...von den "" beim set-Befehl,
dem set /p Text=<ktext.txt und
Einfachste Möglichkeit, die erste Zeile einer Datei in eine Variable einzulesen - "set /p
" erwartet eine (per Enter abgeschlossene) Eingabe, die in diesem Fall per Umleitung (deshalb das "<") eben nicht aus der Konsole (Tastatur), sondern aus der Datei kommt (und den Teil der Datei bis zum ersten Enter = erste Zeilenschaltung und im Ergebnis daher erste Zeile ergibt).dem findstr erklären?
"findstr
" sucht in der angegebenen Datei nach allen Vorkommen des Suchstrings und gibt jede Zeile, die diesen String enthält, als Ergebnis zurück - deshalb muss zum Einen dafür gesorgt werden, dass nur die Zeichen auf der linken Seite gefunden werden (daher wird nicht nach "a", sondern nach "a=" gesucht - Alternative wäre die Vorgabe, nur am Zeilenanfang zu suchen), zum Anderen muss die zurückgegebene Zeile noch zerlegt werden (mit "=" als Trennzeichen) - darum die "herumgewickelte" Schleife ...In der Variablen %CodeChar% landet alles, was in der letzten Zeile, welche "gesuchtes Zeichen=" enthält, nach dem "=" steht - bei korrekter "match.txt" ist das dann genau eine Zeile.
Grüße
bastla
Hallo mathe172!
Sorry - da das Leerzeichen bei meinem Ansatz in der letzten Zeile der "match.txt"/"alphabet.txt" steht und daher trotzdem eine richtige Zuordnung erfolgt, hatte ich nicht darauf geachtet ...
Mit einem zusätzlichen "/c:" wird aber dann auch tatsächlich genau gesucht, daher:
Grüße
bastla
Sorry - da das Leerzeichen bei meinem Ansatz in der letzten Zeile der "match.txt"/"alphabet.txt" steht und daher trotzdem eine richtige Zuordnung erfolgt, hatte ich nicht darauf geachtet ...
Mit einem zusätzlichen "/c:" wird aber dann auch tatsächlich genau gesucht, daher:
for /f "tokens=1-2 delims==" %%i in ('findstr /c:"%Char%=" "%Match%"') do set "CodeChar=%%j"
bastla