Wie kann ich mit Batch aus einer Quelldatei mit einer FOR-Schleige GANZE Zeilen auslesen?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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)

Woher ich das weiß:Berufserfahrung – Software-Entwickler
PWolff  28.05.2018, 14:54

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

0

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!)

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

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
Proximus553 
Fragesteller
 28.05.2018, 13:26

Ja, es gab einen Grund. Danke für die hilfreiche Antwort!

1

Versuchs so:

FOR /f "tokens=*" %%f IN (Quelle.txt) DO echo %%f