it-swarm.com.de

Wie können Sie jede Zeile in einer Textdatei mit einer Windows-Batchdatei durchlaufen?

Ich würde gerne wissen, wie ich jede Zeile in einer Textdatei mit einer Windows-Batchdatei durchläuft und jede Zeile Text nacheinander verarbeitet.

207
Mr. Kraus

Die folgenden Beiträge haben mir sehr geholfen, aber ich habe nicht das getan, was ich in meiner Frage angegeben habe, wo ich die gesamte Linie als Ganzes bearbeiten müsste. Hier ist was ich gefunden habe zu arbeiten.

for /F "tokens=*" %%A in (myfile.txt) do [process] %%A

Das Schlüsselwort token mit einem Sternchen (*) zieht den gesamten Text für die gesamte Zeile. Wenn Sie das Sternchen nicht eingeben, wird nur das erste Wort in der Zeile gezogen. Ich gehe davon aus, dass es mit Leerzeichen zu tun hat. 

Für den Befehl auf TechNet

Ich schätze alle Beiträge!


Wenn der Dateipfad Leerzeichen enthält, müssen Sie usebackq verwenden. Zum Beispiel.

for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A
270
Mr. Kraus

Von der Windows-Befehlszeilenreferenz aus:

Um eine Datei zu analysieren und kommentierte Zeilen zu ignorieren, geben Sie Folgendes ein:

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

Dieser Befehl analysiert jede Zeile in Myfile.txt, ignoriert Zeilen, die mit einem Semikolon beginnen, und übergibt den zweiten und dritten Token von jeder Zeile an den FOR-Hauptteil (Token werden durch Kommas oder Leerzeichen getrennt). Der Hauptteil der FOR-Anweisung verweist auf% i, um das zweite Token zu erhalten,% j, um das dritte Token zu erhalten, und% k, um alle verbleibenden Token zu erhalten. 

Wenn die von Ihnen angegebenen Dateinamen Leerzeichen enthalten, setzen Sie den Text in Anführungszeichen (z. B. "Dateiname"). Um Anführungszeichen verwenden zu können, müssen Sie usebackq verwenden. Andernfalls werden die Anführungszeichen als Definition einer zu analysierenden Literalzeichenfolge interpretiert.

Die Befehlszeilen-Hilfedatei finden Sie übrigens auf den meisten Windows-Systemen unter:

 "C:\WINDOWS\Help\ntcmds.chm"
53
Ash

In einer Batch-Datei müssen Sie anstelle von %%% verwenden: (Typ help for)

for /F "tokens=1,2,3" %%i in (myfile.txt) do call :process %%i %%j %%k
goto thenextstep
:process
set VAR1=%1
set VAR2=%2
set VAR3=%3
COMMANDS TO PROCESS INFORMATION
goto :EOF

Was dies bewirkt: Der Befehl "do call: process %% i %% j %% k" am Ende des Befehls for übergibt die im Befehl for erhaltenen Informationen aus myfile.txt an die Subroutine "process" .

Wenn Sie den Befehl for in einem Stapelverarbeitungsprogramm verwenden, müssen Sie für die Variablen doppelte% -Zeichen verwenden.

In den folgenden Zeilen werden diese Variablen vom Befehl for an die Prozess-Subroutine übergeben, und Sie können diese Informationen verarbeiten.

set VAR1=%1
 set VAR2=%2
 set VAR3=%3

Ich habe einige ziemlich fortgeschrittene Anwendungen dieses exakten Setups, die ich gerne mit Ihnen teilen würde, wenn weitere Beispiele benötigt werden. Fügen Sie Ihr EOL oder Delims hinzu, wenn Sie dies benötigen.

30
user332474

Verbesserung der ersten "FOR/F .." Antwort: Was ich tun musste, war, jedes in MyList.txt aufgeführte Skript auszuführen, damit es für mich funktionierte:

for /F "tokens=*" %A in  (MyList.txt) do CALL %A ARG1

- ODER, wenn Sie es über die Mehrfachzeile tun möchten: 

for /F "tokens=*" %A in  (MuList.txt) do (
ECHO Processing %A....
CALL %A ARG1
)

Edit: Das obige Beispiel ist für die Ausführung einer FOR-Schleife von der Eingabeaufforderung aus; Aus einem Batch-Skript muss ein zusätzliches% hinzugefügt werden (siehe unten):

---START of MyScript.bat---
@echo off
for /F "tokens=*" %%A in  ( MyList.TXT) do  (
   ECHO Processing %%A.... 
   CALL %%A ARG1 
)
@echo on
;---END of MyScript.bat---
22
Yogesh Mahajan

@ MrKraus Antwort ist lehrreich. Lassen Sie mich das hinzufügen, wenn Sie eine Datei laden möchten, die sich in demselben Verzeichnis wie die Batch-Datei befindet. Stellen Sie dem Dateinamen% ~ dp0 voran. Hier ist ein Beispiel:

cd /d %~dp0
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A

NB:: Wenn der Dateiname oder das Verzeichnis (z. B. myfile.txt im obigen Beispiel) ein Leerzeichen enthält (z. B. "meine Datei.txt" oder "c:\Programme"), verwenden Sie:

for /F "tokens=*" %%A in ('type "my file.txt"') do [process] %%A

mit dem Schlüsselwort type das Programm type aufrufen, das den Inhalt einer Textdatei anzeigt. Wenn Sie den Aufwand für den Aufruf des type-Befehls nicht erleiden möchten, sollten Sie das Verzeichnis in das Verzeichnis der Textdatei ändern. Beachten Sie, dass Typ weiterhin für Dateinamen mit Leerzeichen erforderlich ist.

Ich hoffe das hilft jemandem!

21

Die akzeptierte Antwort ist gut, hat aber zwei Einschränkungen.
.__ Leere Zeilen und Zeilen, die mit ; beginnen, werden gelöscht.

Um Zeilen von Inhalten lesen zu können, benötigen Sie die Technik der verzögerten Erweiterung. 

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

Findstr wird verwendet, um jeder Zeile die Zeilennummer und einen Doppelpunkt voranzustellen, so dass leere Zeilen nicht mehr leer sind. 

DelayedExpansion muss deaktiviert werden, wenn auf den Parameter %%a zugegriffen wird. Andernfalls gehen die Ausrufezeichen ! und Carets ^ verloren, da sie in diesem Modus eine spezielle Bedeutung haben. 

Um die Zeilennummer aus der Leitung zu entfernen, muss die verzögerte Erweiterung aktiviert werden.
set "var=!var:*:=!" entfernt alle Zeichen bis zum ersten Doppelpunkt (mit delims=: würden auch alle Doppelpunkte am Anfang einer Zeile entfernt, nicht nur der von findstr).
Das Endlocal deaktiviert die verzögerte Erweiterung für die nächste Zeile erneut.

Die einzige Einschränkung ist jetzt die Begrenzung der Zeilenlänge von ~ 8191, aber es scheint keine Möglichkeit zu geben, dies zu überwinden. 

14
jeb

Oder Sie können die Optionen in Anführungszeichen ausschließen:

FOR /F %%i IN (myfile.txt) DO ECHO %%i
13
Paul

Hier ist eine bat-Datei, die ich geschrieben habe, um alle SQL-Skripts in einem Ordner auszuführen:

REM ******************************************************************
REM Runs all *.sql scripts sorted by filename in the current folder.
REM To use integrated auth change -U <user> -P <password> to -E
REM ******************************************************************

dir /B /O:n *.sql > RunSqlScripts.tmp
for /F %%A in (RunSqlScripts.tmp) do osql -S (local) -d DEFAULT_DATABASE_NAME -U USERNAME_GOES_HERE -P PASSWORD_GOES_HERE -i %%A
del RunSqlScripts.tmp
9
mikej

Wenn Sie ein Windows-Betriebssystem der Windows-Familie haben (eines mit cmd.exe als Shell), versuchen Sie den FOR/F-Befehl .

Modifizierte Beispiele hier, um unsere Rails-Apps auf Heroku aufzulisten - Danke!

cmd /C "heroku list > heroku_apps.txt"
find /v "=" heroku_apps.txt | find /v ".TXT" | findstr /r /v /c:"^$" > heroku_apps_list.txt
for /F "tokens=1" %%i in (heroku_apps_list.txt) do heroku run bundle show Rails --app %%i

Vollständiger Code hier .

1
sendbits

Die akzeptierte Antwort mit cmd.exe und 

for /F "tokens=*" %F in (file.txt) do whatever "%F" ...

funktioniert nur für "normale" Dateien. Es klappt bei großen Dateien kläglich.

Bei großen Dateien müssen Sie möglicherweise Powershell und Folgendes verwenden:

[IO.File]::ReadLines("file.txt") | ForEach-Object { whatever "$_" }

oder wenn Sie genug Speicher haben:

foreach($line in [System.IO.File]::ReadLines("file.txt")) { whatever "$line" } 

Dies funktionierte für mich mit einer 250 MB-Datei mit über 2 Millionen Zeilen, wobei der for /F ...-Befehl nach ein paar tausend Zeilen stecken blieb.

Für die Unterschiede zwischen foreach und ForEach-Object siehe ForEach und ForEach-Object kennenlernen .

(Credits: Datei zeilenweise in PowerShell lesen )

0
mivk