Batch-Dateien: Wie lese ich eine Datei?

97

Wie können Sie eine Datei (Text oder Binärdatei) aus einer Batchdatei lesen? Gibt es eine Möglichkeit, es im Binär- oder Textmodus zu lesen?

Lucas Gabriel Sánchez
quelle
@ RookieTEC9: Ja, ich weiß, dass es sich um zwei völlig unterschiedliche Dinge handelt, aber ich brauchte eine Antwort, die in msdos funktioniert, nicht in Windows nt (oder neueren Versionen). Auch diese Frage wurde vor 7 Jahren gestellt. Denken Sie daran
Lucas Gabriel Sánchez
@ RookieTEC9: Ich denke du hast recht, es ist eine Weile her seitdem. Ich werde nur das ms-dos-Tag entfernen
Lucas Gabriel Sánchez
1
Sie können den Befehl TYPE [fileName]für MS-Dos verwenden.
RookieTEC9
Probieren
Sie

Antworten:

40

Sie können den Befehl for verwenden:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

Art

for /?

an der Eingabeaufforderung. Sie können auch INI-Dateien analysieren !

Johnstok
quelle
25
Dies ist ein ziemlich komplexes Beispiel, bei dem sehr spezifische Informationen aus einer besonders formatierten Textdatei analysiert werden, ohne eine Erklärung zu geben. Gemäß for /?dem Befehl wird jede Zeile in myfile.txt analysiert, wobei Zeilen, die mit einem Semikolon beginnen, ignoriert werden und das 2. und 3. Token von jeder Zeile an den for-Body übergeben werden, wobei Token durch Kommas und / oder Leerzeichen getrennt sind.
Martin Prikryl
2
Ihr Beispiel stammt aus der Hilfe von cmd.exe. Sie sollten einen Hinweis dazu hinzufügen oder die gesamte Beschreibung kopieren.
Th. Thielemann
70

Unter cmd.exe im NT-Stil können Sie die Zeilen einer Textdatei mit durchlaufen

FOR /F %i IN (file.txt) DO @echo %i

Geben Sie an der Eingabeaufforderung "help for" ein, um weitere Informationen zu erhalten. (Ich weiß nicht, ob das unter dem von Ihnen verwendeten "DOS" funktioniert.)

devio
quelle
22
Es sollte sein %%i.
Jim Fell
32
Dieser Befehl beendet das Lesen einer Zeile, wenn ein Leerzeichen gefunden wird. Schließlich habe ich FOR / F "tokens = *" %% i IN (file.txt) DO @ECHO %% i
Jason
9
Es klappt! und Wenn Sie die Konsole verwenden, versuchen Sie% i, wenn Sie eine Bat-Datei verwenden, dann versuchen Sie %% i.
Steven Du
41

Die FOR-LOOP funktioniert im Allgemeinen, es gibt jedoch einige Probleme. Das FOR akzeptiert keine Leerzeilen und Zeilen mit mehr als ~ 8190 sind problematisch. Die Erweiterung funktioniert nur dann zuverlässig, wenn die verzögerte Erweiterung deaktiviert ist.

Der Nachweis von CR / LF gegenüber einfachem LF scheint ebenfalls etwas kompliziert zu sein.
Auch NUL-Zeichen sind problematisch, da eine FOR-Schleife das Lesen sofort abbricht.

Ein direktes binäres Lesen scheint daher nahezu unmöglich.

Das Problem mit leeren Zeilen kann mit einem Trick gelöst werden. Stellen Sie jeder Zeile mit dem Befehl findstr eine Zeilennummer voran und entfernen Sie nach dem Lesen das Präfix.

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    ENDLOCAL
)

Das Umschalten zwischen aktivierter und deaktivierter verzögerter Erweiterung ist für das sichere Arbeiten mit Zeichenfolgen wie !oder erforderlich^^^xy!z . Dies liegt
daran, dass die Zeile set "var=%%a"nur mit DisabledDelayedExpansion sicher ist. Andernfalls werden Ausrufezeichen entfernt und die Carets als (sekundäre) Escape-Zeichen verwendet und auch entfernt.
Die Verwendung der Variablen varist jedoch nur mit EnabledDelayedExpansion sicher , da selbst a call %%var%%mit Inhalten wie fehlschlägt "&"&.

BEARBEITEN: Set / p-Variante hinzugefügt
Es gibt eine zweite Möglichkeit, eine Datei mit zu lesen set /p. Die einzigen Nachteile sind, dass sie auf ~ 1024 Zeichen pro Zeile begrenzt ist und Steuerzeichen am Zeilenende entfernt werden.
Der Vorteil ist jedoch, dass Sie das verzögerte Umschalten nicht benötigen und es einfacher ist, Werte in Variablen zu speichern

@echo off
setlocal EnableDelayedExpansion
set "file=%~1"

for /f "delims=" %%n in ('find /c /v "" %file%') do set "len=%%n"
set "len=!len:*: =!"

<%file% (
  for /l %%l in (1 1 !len!) do (
    set "line="
    set /p "line="
    echo(!line!
  )
)

Zum Lesen von "binär" in eine Hex-Darstellung
Sie können sich SO ansehen : Konvertieren einer Binärdatei in eine HEX-Darstellung mithilfe einer Batch-Datei

jeb
quelle
Vielen Dank für den Hinweis auf die Verwendung von set /p. Ich habe set /p value=< result.txtdie erste Zeile aus einer Textdatei
abgerufen
Jeb, ich habe eine verwandte Frage basierend auf Ihrer Lösung oben in stackoverflow.com/questions/11408295/…
Nicholas
Was ist mit dem EOF-Zeichen (End of File), ASCII 0x1A? verhält for /Fsich genauso wie bei NUL ( 0x00) Zeichen?
aschipfl
@aschipfl Ich nehme an, der 0x1A verhält sich in einigen Fällen wie ein Zeilenvorschub (oder besser, er wird in einen Zeilenvorschub übersetzt). Gibt es eine Möglichkeit, einen SUB ohne Verwendung einer temporären Datei zu erstellen?
Jeb
Dies sollte die akzeptierte Antwort sein, sie ist kinderleicht, selbst wenn die Zeilen mit :oder ;oder beginnen!
HackingAddict1337
10

Eine sehr einfache Möglichkeit ist die Verwendung des folgenden Befehls:

set /p mytextfile=< %pathtotextfile%\textfile.txt
echo %mytextfile%

Dadurch wird nur die erste Textzeile in einer Textdatei angezeigt. Die andere Möglichkeit besteht darin, den folgenden Befehl zu verwenden:

type %pathtotextfile%\textfile.txt

Dadurch werden alle Daten in der Textdatei auf dem Bildschirm angezeigt. Hoffe das hilft!

J. Bond
quelle
1

Nun, es gibt viele verschiedene Möglichkeiten, aber wenn Sie den Text nur ANZEIGEN und nirgendwo speichern möchten, verwenden Sie einfach: findstr /v "randomtextthatnoonewilluse" filename.txt

NetvorMcWolf
quelle
0

Korrigierter Code:

setlocal enabledelayedexpansion
for /f "usebackq eol= tokens=* delims= " %%a in (`findstr /n ^^^^ "name with spaces.txt"`) do (
    set line=%%a
    set "line=!line:*:=!"
    echo(!line!
)
endlocal
pause
Celes
quelle
Vom Hauptcode der Seite. Anführungszeichen sind nicht richtig positioniert, der Code ist nicht für Dateien mit Namen mit Leerzeichen geeignet. Meins ist. Ich gebe hier den Trick der ^^^^
Celes
Sie haben Recht mit den Anführungszeichen um den Dateinamen, aber Ihr Code hat einige Probleme: eol=und delims=sind überflüssig, set line=%%asollten Anführungszeichen verwenden und ohne den verzögerten Erweiterungsmodus umzuschalten, kann der Code keine Ausrufezeichen lesen
jeb
-1
set a=type 1.csv

Dadurch wird der Inhalt von 1.csv in der Variablen 'a' gespeichert:

Geben Sie hier die Bildbeschreibung ein

PDHide
quelle
2
Das speichert nicht den Inhalt der Datei in der Variablen, sondern den Befehl type 1.csv, führt also %a%nur diesen Befehl aus. Überprüfen Sie mitset a
Stephan
-5

Ein Code, der den Inhalt der Datei myfile.txt auf dem Bildschirm anzeigt

setze% filecontent% = 0
type% filename% >>% filecontent%
echo% filecontent%

Jani Pierwszy
quelle
3
Bitte versuchen Sie es vor dem Posten mindestens mit dem Code. Das ist nur Unsinn.
Stephan