Wie kann ich mit Batch aus einer Quelldatei mit einer FOR-Schleige GANZE Zeilen auslesen?
Ich habe mir bereits eine FOR-Schleife zu diesem Zwecke geschrieben, alledings bekomme ich leider nie die gesamte Zeile raus, sondern nur das erste Wort. Hier ist ein Beispiel:
Quelle.txt:
Hallo Alice!
Ich bin eine Testdatei.
Freut mich, dass du da bist.
Auslesen.bat:
@echo off
FOR /f %%f IN (Quelle.txt) DO echo %%f
pause >NUL
Kommandozeilenoutput:
Hallo
Ich
Freut
Danke für eure Hilfe! :)
5 Antworten
Ich benutze meistens folgendes und hatte noch nie Probleme damit:
FOR /F "delims=" %%L in (datei.txt) do echo/%%L
Dass dein for-Loop nicht wie gewünscht funktioniert liegt daran:
Standardmäßig liefert "/F" den ersten, durch ein Leerzeichen getrennten Token von jeder Zeile in jeder Datei. Leerzeilen werden übersprungen. Das standardmäßige Verhalten bei der Analyse kann wahlweise durch den Parameter "Optionen" überschrieben werden.
~ Hilfe von for [ for/?]
Alternativ sollte auch das hier funktionieren: (tokens=* wählt praktisch die ganze Zeile aus.)
FOR /F "tokens=*" %%L in (datei.txt) do echo/%%L
Lies dir dazu am besten die Hilfe von for durch. Hier das wichtigste zu den Optionen (wie delims oder tokens):
eol=c - Gibt das Zeichen für Zeilenendekommentare an
(nur eins).
skip=n - Gibt die Anzahl der Zeilen an, die am Anfang einer
Datei übersprungen werden.
delims=xxx - Gibt einen Satz von Trennzeichen an. Diese ersetzen
die Standardtrennzeichen TAB und Leerzeichen.
tokens=x,y,m-n - Gibt an, welche Token von jeder Zeile an die
FOR-Schleife weitergegeben werden.
Das führt dazu, dass zusätzliche Variablen erstellt
werden. Mit der Form m-n wird dabei ein Bereich vom
m-ten bis zum n-ten Token angegeben. Wenn das letzte
Zeichen ein Sternchen ist, wird eine zusätzliche
Variable deklariert, die den verbleibenden Text
dieser Zeile enthält.
usebackq - Gibt an, dass die neue Semantik in Kraft ist,
wobei eine Zeichenfolge in umgekehrten Anführungs-
zeichen als Befehl ausgeführt wird und eine
Zeichenfolge in Anführungszeichen ein literaler
Befehl ist, der die Verwendung von doppelten
Anführungszeichen um Dateinamen in Dateien-
sätzen erlaubt.
Zum besseren Verständnis sind in der Hilfe auch Beispiele enthalten.
~Tim
for /f " [sonstige Optionen] delims=" %%A in (...) do ...
(die "delims"-Option muss die letzte vor den schließenden Anführungszeichen sein, weil sonst das nächste Zeichen nach "delims=" als Token-Begrenzer interpretiert würde, und es darf auch kein Leerzeichen oder anderes Zeichen zwischen "delims=" und dem schließenden Anführungszeichen stehen)
Es sei denn, du willst auf die einzelnen Wörter zugreifen -- dann brauchst du natürlich mehrere Tokens. Aber dann muss z. B. jedes 5. Wort einer Zeile immer dieselbe Bedeutung haben.
(Das ist auch der Grund, warum ich mir angewöhnt habe, %%A als Variable zu nehmen -- dann habe ich 26 Variablen für Tokens frei und brauche mir am wenigsten Gedanken zu machen, ob ich noch genügend Buchstaben frei habe)
Wenn es nur darum geht, den Inhalt einer Textdatei anzuzeigen, dürfte
type [Dateiname]
(alle Zeilen der Reihe nach; ggf. nur die letzten sichtbar) oder auch
more [Dateiname]
(Anzeige "seitenweise"; Leertaste: nächste Seite, Zeilenschaltung: nächste Zeile) das Tool der Wahl sein
wenn es denn ein for-Loop sein soll dann ordentlich:
Diese Variante ignoriert jegliche Leerzeilen
@echo off
for /f "usebackq tokens=*" %%f in ("Quelle.txt") do echo %%f
pause
exit /b
das ganze mal zerlegt:
usebackq ist in diesem fall ein "Kompatibilitäts-Hack" den die Entwickler einführten, als Windows Dateinamen mit Leerzeichen bekam.
So kann im in-Block ein Dateiname nit Leerzeichen in Anführungszeichen " " seinen Inhalt ausgeben.
Tokens=* weist der Variable %%f die Ganze Zeile zu (ignoriert jegliche Delimiter)
Diese Variante ignoriert jegliche Leerzeilen
Hallo Alice!
Ich bin eine Testdatei.
Freut mich, dass du da bist.
Um auch Leerzeilen auszugeben muss man wieder mal in dei Trickkiste greifen:
for /f " tokens=1* delims=]" %%f in ('find /v /i /n "" "Quelle.txt"') do echo:%%g
mit find /v "" suchen wir nach nicht nichts (also alles)
der parameter /n nummeriert die Zeilen.
eine Zeile sieht dann so aus:
[1]Hallo Alice!
[2]
...
delims=] trennt die Zeile am Zeichen ] .
tokens=1* sorgt dafür, das das der delimiter nach dem ersten Aftreten ignoriert wird . Die variable %% f enthält nun [1 , die Folge-Variable %%g den Rest der Zeile und wenn es eine Leerzeile war eben nichts.
echo:%%g gibt in jedem Fall einen Zeilenforschub aus, egal ob %%g etwas enthält oder nicht. (ein Punkt oder Doppelpunkt gleich hinter echo ist wichtig, wenn man mit evtl. leeren Variablen arbeitet!)
Gibt es einen Grund, wieso du eine FOR-Schleife brauchst? Es ginge viel einfacher so:
type Quelle.txt
Wenn es eine FOR-Schleife sein soll:
for /F "tokens=*" %%f in (Quelle.txt) do echo %%f
Ja, es gab einen Grund. Danke für die hilfreiche Antwort!
Versuchs so:
FOR /f "tokens=*" %%f IN (Quelle.txt) DO echo %%f