Ich möchte wissen, wie man jede Zeile in einer Textdatei mit einer Windows-Batchdatei durchläuft und jede Textzeile nacheinander verarbeitet.
Ich möchte wissen, wie man jede Zeile in einer Textdatei mit einer Windows-Batchdatei durchläuft und jede Textzeile nacheinander verarbeitet.
Antworten:
Die folgenden Beiträge haben sehr geholfen, aber nicht das getan, was ich in meiner Frage angegeben habe, wo ich die gesamte Zeile als Ganzes verarbeiten musste. Folgendes habe ich gefunden, um zu arbeiten.
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A
Das Token-Schlüsselwort mit einem Sternchen (*) zieht den gesamten Text für die gesamte Zeile ab. Wenn Sie das Sternchen nicht eingeben, wird nur das erste Wort in der Zeile angezeigt. Ich nehme an, es hat mit Leerzeichen zu tun.
Ich schätze alle Beiträge!
Wenn Ihr Dateipfad Leerzeichen enthält, müssen Sie diese verwenden usebackq
. Beispielsweise.
for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A
for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A
-> A = myfile.txt
. Irgendwelche Ideen, wie dies vereitelt werden kann?
Aus der Windows-Befehlszeilenreferenz:
Geben Sie Folgendes ein, um eine Datei zu analysieren und kommentierte Zeilen zu ignorieren:
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 das zweite und dritte Token von jeder Zeile an den FOR-Body (Token werden durch Kommas oder Leerzeichen getrennt). Der Hauptteil der FOR-Anweisung verweist auf% i, um das zweite Token abzurufen,% j, um das dritte Token abzurufen, und% k, um alle verbleibenden Token abzurufen.
Wenn die von Ihnen angegebenen Dateinamen Leerzeichen enthalten, verwenden Sie Anführungszeichen um den Text (z. B. "Dateiname"). Um Anführungszeichen zu verwenden, müssen Sie usebackq verwenden. Andernfalls werden die Anführungszeichen so interpretiert, dass sie eine zu analysierende Literalzeichenfolge definieren.
Übrigens finden Sie die Befehlszeilen-Hilfedatei auf den meisten Windows-Systemen unter:
"C:\WINDOWS\Help\ntcmds.chm"
In einer Batchdatei Sie MÜSSEN verwenden %%
statt %
: (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: Das "do call: process %% i %% j %% k" am Ende des for-Befehls übergibt die im for-Befehl von myfile.txt erfassten Informationen an die "process" -Unterroutine.
Wenn Sie den Befehl for in einem Stapelverarbeitungsprogramm verwenden, müssen Sie doppelte% -Zeichen für die Variablen verwenden.
In den folgenden Zeilen werden diese Variablen vom Befehl for an die Unterroutine des Prozesses übergeben, und Sie können diese Informationen verarbeiten.
set VAR1=%1
set VAR2=%2
set VAR3=%3
Ich habe einige ziemlich fortgeschrittene Anwendungen dieses genauen Setups, die ich gerne teilen würde, wenn weitere Beispiele benötigt werden. Fügen Sie Ihre EOL oder Delims nach Bedarf hinzu.
Verbesserung der ersten "FOR / F .." - Antwort: Ich musste jedes in MyList.txt aufgelistete Skript ausführen, damit es für mich funktioniert:
for /F "tokens=*" %A in (MyList.txt) do CALL %A ARG1
- ODER, wenn Sie es über mehrere Zeilen tun möchten:
for /F "tokens=*" %A in (MuList.txt) do (
ECHO Processing %A....
CALL %A ARG1
)
Bearbeiten: Das oben angegebene Beispiel dient zum Ausführen der FOR-Schleife an der Eingabeaufforderung. Aus einem Batch-Skript muss ein zusätzliches% hinzugefügt werden, wie unten gezeigt:
---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---
@ MrKraus ' Antwort ist aufschlussreich . Lassen Sie mich außerdem hinzufügen, dass Sie dem Dateinamen% ~ dp0 voranstellen , wenn Sie eine Datei laden möchten, die sich im selben Verzeichnis wie die Batchdatei befindet. Hier ist ein Beispiel:
cd /d %~dp0
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A
NB :: Wenn Ihr Dateiname oder Verzeichnis (z. B. myfile.txt im obigen Beispiel) ein Leerzeichen enthält (z. B. 'my file.txt' oder 'c: \ Programme'), verwenden Sie:
for /F "tokens=*" %%A in ('type "my file.txt"') do [process] %%A
mit dem Schlüsselwort type , das das type
Programm aufruft und den Inhalt einer Textdatei anzeigt. Wenn Sie nicht den Aufwand für den Aufruf des Befehls type erleiden möchten, sollten Sie das Verzeichnis in das Verzeichnis der Textdatei ändern. Beachten Sie, dass der Typ für Dateinamen mit Leerzeichen weiterhin erforderlich ist.
Ich hoffe das hilft jemandem!
**cd /d %~dp0**
vor der for-Schleife aufrufen . Dies würde sicherstellen, dass Sie auf eine Datei in dem Verzeichnis verweisen, in dem sich die Batch-Datei befindet. Vielen Dank für die Beobachtung
type
Walkaround
type
Arbeit nicht zum Laufen bringen, ich musste meinen Dateinamen zitieren, weil er sich in einem anderen Verzeichnis befindet, das Leerzeichen enthält (Verdammt noch mal Program Files
). Ich The system cannot find the file `type.
Die akzeptierte Antwort ist gut, hat aber zwei Einschränkungen.
Es werden leere Zeilen und Zeilen gelöscht, die mit beginnen;
Um Zeilen mit Inhalten lesen zu können, benötigen Sie die Technik zum Umschalten 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, sodass leere Zeilen nicht mehr leer sind.
DelayedExpansion muss deaktiviert werden, wenn auf den %%a
Parameter !
zugegriffen ^
wird. Andernfalls gehen Ausrufezeichen und Carets verloren, da sie in diesem Modus eine besondere Bedeutung haben.
Um die Zeilennummer aus der Leitung zu entfernen, muss die verzögerte Erweiterung aktiviert werden.
set "var=!var:*:=!"
Entfernt alle bis zum ersten Doppelpunkt (mit delims=:
würde auch alle Doppelpunkte am Anfang einer Zeile entfernt, nicht nur der aus findstr).
Das Endlokal deaktiviert die verzögerte Erweiterung für die nächste Zeile erneut.
Die einzige Einschränkung ist jetzt die Zeilenlängenbeschränkung von ~ 8191, aber es scheint keine Möglichkeit zu geben, dies zu überwinden.
setlocal
Kommandozeile. Wenn ich Code auf CMD ausführe, erhalte ich! Var! statt Leerzeichen. Wie repariert man?
Hier ist eine Bat-Datei, die ich geschrieben habe, um alle SQL-Skripte 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
Wenn Sie eine NT-Familie von Windows (eines mit haben cmd.exe
als Shell), versuchen Sie die FOR / F - Befehl .
Die akzeptierte Antwort mit cmd.exe
und
for /F "tokens=*" %F in (file.txt) do whatever "%F" ...
funktioniert nur für "normale" Dateien. Bei riesigen Dateien scheitert es kläglich.
Für große 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 bei mir mit einer 250-MB-Datei mit über 2 Millionen Zeilen, bei der der for /F ...
Befehl nach einigen tausend Zeilen hängen blieb.
Die Unterschiede zwischen foreach
und ForEach-Object
finden Sie unter Kennenlernen von ForEach und ForEach-Object .
(Credits: Datei zeilenweise in PowerShell lesen )
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 .
for /f "tokens=1" %%i in ('find /v "=" heroku_apps.txt ^| find /v ".TXT" ^| findstr /r /v /c:"^$"') do...
(Beachten Sie die Hinzufügung von ^
's, die zum Entweichen aus der Pipe verwendet werden, damit sie an den for
und nicht direkt an den Befehlsprozessor übergeben werden)
So drucken Sie alle Zeilen in einer Textdatei über die Befehlszeile (mit verzögerter Erweiterung):
set input="path/to/file.txt"
for /f "tokens=* delims=[" %i in ('type "%input%" ^| find /v /n ""') do (
set a=%i
set a=!a:*]=]!
echo:!a:~1!)
Funktioniert mit führenden Leerzeichen, Leerzeilen und Leerzeichen.
Getestet auf Win 10 CMD
]]]
Zeilen. Die zweite Probe lässt leere Linien und Linien fallen, die mit Leerzeichen beginnen
delims
wenn irgendwelche Zeilen in der Textdatei mit ]
z. durch ein Zeichen ersetzen, das dies nicht tut, oder durch ein Steuerzeichen wie Rücktaste oder Glocke; Sie werden normalerweise nicht in Textdateien gefunden. Der Grund delims=]
ist Platzhalter erstellt entfernen /n
von find
Befehlsleerzeilen zu bewahren.
%%A
durch%A
den obigen Befehl. Sonst wirst du bekommen%%A was unexpected at this time.
.