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?


@ 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

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 !


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


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


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!


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


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

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


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%


3
Bitte versuchen Sie es vor dem Posten mindestens mit dem Code. Das ist nur Unsinn.
Stephan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.