Wie tun Sie Schleife durch jede Zeile in einer Textdatei eine Windows-Batch-Datei?

StackOverflow https://stackoverflow.com/questions/155932

  •  03-07-2019
  •  | 
  •  

Frage

würde Ich mag in einer Textdatei wissen, wie durch jede Zeile in einer Schleife eine Windows-Batch-Datei und Prozess jede Textzeile nacheinander verwendet wird.

War es hilfreich?

Lösung

Die Beiträge unter sehr geholfen, aber nicht tun, was ich in meiner Frage erwähnt, wo ich die ganze Zeile als Ganze zu verarbeiten benötigt. Hier ist, was ich zur Arbeit gefunden.

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

Das Token-Schlüsselwort mit einem Sternchen (*) wird die gesamten Text für die gesamte Linie ziehen. Wenn Sie nicht in dem Sternchen setzen wird es nur das erste Wort in der Zeile ziehen. Ich nehme an, es mit Leerzeichen zu tun hat.

für Command auf TechNet

Ich schätze all die Beiträge!


Wenn Sie Leerzeichen im Dateipfad sind, müssen Sie usebackq verwenden. Zum Beispiel.

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

Andere Tipps

Von der Windows-Befehlszeilenreferenz:

Um eine Datei zu analysieren, kommentierten Zeilen zu ignorieren, geben Sie:

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

Dieser Befehl analysiert jede Zeile in MyFile.txt, Zeilen ignorieren, die mit einem Semikolon und Leiten der zweiten und dritte Token von jeder Zeile an den für Körper beginnen (Token werden durch Kommas oder Leerzeichen getrennt). Der Körper der Aussage Referenzen% FOR i das zweite Token zu bekommen,% j die dritten Token und% k erhält alle verbleibenden Token zu erhalten.

Wenn die Dateinamen, die Sie Leerzeichen liefern, verwenden Sie Anführungszeichen um den Text (zB „Dateiname“). So verwenden Sie Anführungszeichen, müssen Sie verwenden usebackq. Andernfalls werden die Anführungszeichen interpretiert als eine Zeichenkette definieren, zu analysieren.

By the way, können Sie den Befehl Online-Hilfedatei auf den meisten Windows-Systemen finden Sie unter:

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

In einer Batchdatei Sie muss Verwendung %% 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 das bedeutet: Die „nennen: Prozess %% i j %% k %%“. Am Ende des für den Befehl übergibt die Informationen in dem von myfile.txt zu dem „Prozess“ für den Befehl erworben ‚Unterprogramm‘

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

Die folgenden Zeilen passieren diese Variablen von dem für den Befehl zum Prozess ‚Unterroutine‘ und ermöglichen es Ihnen, diese Informationen zu verarbeiten.

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

Ich habe einige ziemlich fortgeschrittene Anwendungen dieser genauen Setup, das ich bereit sein würde, wenn weitere Beispiele benötigt werden, zu teilen. Fügen Sie in Ihrem EOL oder delims nach Bedarf natürlich.

Die Verbesserung der erste "FOR / F .." Antwort: Was ich tun musste, war jedes Skript in MyList.txt aufgeführt ausführen zu nennen, so ist es für mich gearbeitet:

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

- OR, wenn Sie möchten es über die mehrzeilige tun:

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

Edit: Das oben gegebene Beispiel ist für die FOR-Schleife von Befehlsaufforderung ausführt; aus einem Batch-Skript, muss ein zusätzliches% hinzugefügt werden, wie unten dargestellt:

---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 beantworten ist lehrreich. als Batch-Datei, stellen Sie dem Dateinamen mit% ~ dp0 Ferner lassen Sie mich das hinzufügen, wenn Sie eine Datei im selben Verzeichnis laden möchten. Hier ein Beispiel:

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

Hinweis: : Wenn der Dateinamen oder Verzeichnis (zB myfile.txt in dem obigen Beispiel) einen Raum (zB 'mein file.txt' oder 'c: \ Program Files'), verwenden:

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

, mit dem Typ Schlüsselwort des type Programm aufrufen, die den Inhalt einer Textdatei anzeigt. Wenn Sie den Aufwand nicht den Typ Befehl aufzurufen leiden wollen, sollten Sie das Verzeichnis in das Verzeichnis der Textdatei ändern. Beachten Sie, dass Typ noch für Dateinamen mit Leerzeichen erforderlich ist.

Ich hoffe, das hilft jemand!

Die akzeptierte Antwort ist gut, hat aber zwei Einschränkungen.
Es fällt leere Zeilen und Zeilen mit ; beginnen

Zeilen von Inhalten zu lesen, müssen Sie die verzögerte Expansion Makel Technik.

@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 verwendet wird, jede Zeile mit der Zeilennummer und einem Doppelpunkt voran, sind so leere Zeilen nicht mehr leer.

DelayedExpansion muss deaktiviert werden, wenn die %%a Parameter zugreifen, sonst Ausrufezeichen ! und Carets ^ verloren gehen, da sie in diesem Modus eine besondere Bedeutung haben.

Aber die Zeilennummer aus der Leitung zu entfernen, muss die verzögerte Erweiterung aktiviert werden.
set "var=!var:*:=!" entfernt alle bis zum ersten Doppelpunkt (delims=: Verwendung entfernen würde auch alle Doppelpunkt am Anfang einer Zeile, nicht nur das eines von findstr).
Die endlocal deaktiviert die verzögerte Expansion wieder für die nächste Zeile.

Die einzige Einschränkung ist nun die Leitungslänge Grenze von ~ 8191, aber es scheint keine Möglichkeit, dies zu überwinden.

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

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

Hier ist eine Fledermaus-Datei Ich schrieb alle SQL-Skripte in einem Ordner ausfü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 cmd.exe als Shell) haben, versuchen Sie die FOR / F-Befehl .

Die akzeptierten anwser mit cmd.exe und

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

funktioniert nur für „normale“ Dateien. Es scheitert kläglich mit großen Dateien.

Für große Dateien, müssen Sie möglicherweise Powershell und so etwas verwenden:

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

oder wenn Sie genügend Speicher haben:

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

Das funktionierte für mich mit einer 250 MB-Datei mehr als 2 Millionen Zeilen enthalten, wobei der for /F ... Befehl nach ein paar tausend Zeilen stecken geblieben.

Für die Unterschiede zwischen foreach und ForEach-Object finden Sie unter Getting FürJeden und ForEach-Object wissen.

(Credits: Dateizeile lesen Zeile in Powershell )

hier Umgebaute Beispiele unserer Rails-Anwendungen auf Heroku zur Liste - dank

!
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

Voll code hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top