Ich möchte wissen, wie man jede Zeile in einer Textdatei mit einer Windows-Batchdatei durchläuft und jede Textzeile nacheinander verarbeitet.
windows
batch-file
Herr Kraus
quelle
quelle
%%A
durch%A
den obigen Befehl. Sonst wirst du bekommen%%A was unexpected at this time.
.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:
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:
quelle
usebackq
“ :for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")
In einer Batchdatei Sie MÜSSEN verwenden
%%
statt%
: (Typhelp for
)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.
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.
quelle
Verbesserung der ersten "FOR / F .." - Antwort: Ich musste jedes in MyList.txt aufgelistete Skript ausführen, damit es für mich funktioniert:
- ODER, wenn Sie es über mehrere Zeilen tun möchten:
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:
quelle
@ 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:
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:
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!
quelle
**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 Beobachtungtype
Walkaroundtype
Arbeit nicht zum Laufen bringen, ich musste meinen Dateinamen zitieren, weil er sich in einem anderen Verzeichnis befindet, das Leerzeichen enthält (Verdammt noch malProgram Files
). IchThe 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.
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 (mitdelims=:
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.
quelle
setlocal
Kommandozeile. Wenn ich Code auf CMD ausführe, erhalte ich! Var! statt Leerzeichen. Wie repariert man?Oder Sie können die Optionen in Anführungszeichen ausschließen:
quelle
Hier ist eine Bat-Datei, die ich geschrieben habe, um alle SQL-Skripte in einem Ordner auszuführen:
quelle
Wenn Sie eine NT-Familie von Windows (eines mit haben
cmd.exe
als Shell), versuchen Sie die FOR / F - Befehl .quelle
Die akzeptierte Antwort mit
cmd.exe
undfunktioniert 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:
oder wenn Sie genug Speicher haben:
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
undForEach-Object
finden Sie unter Kennenlernen von ForEach und ForEach-Object .(Credits: Datei zeilenweise in PowerShell lesen )
quelle
Modifizierte Beispiele hier, um unsere Rails-Apps auf Heroku aufzulisten - danke!
Vollständiger Code hier .
quelle
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 denfor
und nicht direkt an den Befehlsprozessor übergeben werden)So drucken Sie alle Zeilen in einer Textdatei über die Befehlszeile (mit verzögerter Erweiterung):
Funktioniert mit führenden Leerzeichen, Leerzeilen und Leerzeichen.
Getestet auf Win 10 CMD
quelle
]]]
Zeilen. Die zweite Probe lässt leere Linien und Linien fallen, die mit Leerzeichen beginnendelims
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 Grunddelims=]
ist Platzhalter erstellt entfernen/n
vonfind
Befehlsleerzeilen zu bewahren.