Bagaimana Anda mengulangi setiap baris dalam file teks menggunakan file batch windows?

244

Saya ingin tahu cara mengulang setiap baris dalam file teks menggunakan file batch Windows dan memproses setiap baris teks secara berurutan.

Tuan Kraus
sumber

Jawaban:

304

Posting di bawah ini sangat membantu, tetapi tidak melakukan apa yang saya nyatakan dalam pertanyaan saya di mana saya perlu memproses seluruh baris secara keseluruhan. Inilah yang saya temukan bekerja.

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

Kata kunci token dengan tanda bintang (*) akan menarik semua teks untuk seluruh baris. Jika Anda tidak memasukkan tanda bintang, itu hanya akan menarik kata pertama di telepon. Saya menganggap itu ada hubungannya dengan spasi.

Untuk Perintah di TechNet

Saya menghargai semua posting!


Jika ada spasi di jalur file Anda, Anda perlu menggunakannya usebackq. Sebagai contoh.

for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A
Tuan Kraus
sumber
37
Tambahan kecil: untuk membuat ini bekerja dari baris perintah secara interaktif, ganti %%Adengan %Apada perintah di atas. Kalau tidak, Anda akan mendapatkan %%A was unexpected at this time..
vadipp
16
FYI, jika Anda perlu melakukan perintah multi-line, setelah "DO" Anda dapat meletakkan tanda kurung terbuka "(" dan beberapa baris kemudian, akhiri dengan tanda kurung dekat ")" - dan Anda bisa meletakkan kode Anda memblokir di dalamnya (indentasi dengan selera Anda).
BrainSlugs83
3
Terima kasih untuk polanya. Saya telah menemukan bahwa saya tidak dapat menempatkan tanda kutip (") di sekitar nama file - Untuk nama file dengan spasi hanya memberi saya nama file. Misalnya for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A-> A = myfile.txt. Adakah ide bagaimana menggagalkan ini?
akan
1
Pastikan file yang Anda kerjakan dikodekan dalam ANSI atau UTF8. Saya menggaruk-garuk kepala mengapa ini tidak berhasil sampai saya mencoba melihat file menggunakan perintah TYPE dan output tidak seperti yang saya harapkan. Pada titik ini saya perhatikan file telah dikodekan dalam "UCS-2 BE BOM" karena beberapa alasan!
Dan Stevens
1
Patut ditunjukkan bahwa parameter indeks di loop Anda harus satu karakter. Jadi misalnya %% saya baik-baik saja tetapi indeks %% akan gagal.
Vincent
59

Dari referensi baris perintah Windows:

Untuk mem-parsing file, mengabaikan baris komentar, ketik:

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

Perintah ini mem-parsing setiap baris dalam Myfile.txt, mengabaikan garis yang dimulai dengan titik koma dan meneruskan token kedua dan ketiga dari setiap baris ke badan FOR (token dibatasi oleh koma atau spasi). Badan pernyataan FOR merujuk% i untuk mendapatkan token kedua,% j untuk mendapatkan token ketiga, dan% k untuk mendapatkan semua token yang tersisa.

Jika nama file yang Anda berikan mengandung spasi, gunakan tanda kutip di sekitar teks (misalnya, "Nama File"). Untuk menggunakan tanda kutip, Anda harus menggunakan usebackq. Kalau tidak, tanda kutip ditafsirkan sebagai mendefinisikan string literal untuk diuraikan.

Omong-omong, Anda dapat menemukan file bantuan baris perintah pada sebagian besar sistem Windows di:

 "C:\WINDOWS\Help\ntcmds.chm"
Abu
sumber
8
untuk mengklarifikasi dengan "menggunakan tanda kutip, Anda harus menggunakan usebackq" : for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")
drzaus
35

Dalam File Batch Anda HARUS menggunakan %%alih-alih %: (Ketik 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

Kegunaannya: The "do call: process %% i %% j %% k" di akhir perintah for meneruskan informasi yang diperoleh di perintah for dari myfile.txt ke "proses" 'subrutin'.

Saat Anda menggunakan perintah for dalam program batch, Anda perlu menggunakan tanda% ganda untuk variabel.

Baris berikut meneruskan variabel-variabel tersebut dari perintah for ke proses 'sub rutin' dan memungkinkan Anda untuk memproses informasi ini.

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

Saya memiliki beberapa kegunaan lanjutan dari pengaturan yang tepat ini yang akan saya bagikan jika diperlukan contoh lebih lanjut. Tambahkan EOL atau Delims Anda sesuai kebutuhan tentu saja.

pengguna332474
sumber
27

Meningkatkan jawaban "FOR / F .." pertama: Yang harus saya lakukan adalah memanggil eksekusi setiap skrip yang terdaftar di MyList.txt, jadi itu bekerja untuk saya:

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

--OR, jika Anda ingin melakukannya di beberapa baris:

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

Sunting: Contoh yang diberikan di atas adalah untuk mengeksekusi loop FOR dari command-prompt; dari skrip batch,% tambahan perlu ditambahkan, seperti yang ditunjukkan di bawah ini:

---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---
Yogesh Mahajan
sumber
21

@ MrKraus ini jawabannya adalah instruktif. Selanjutnya, izinkan saya menambahkan bahwa jika Anda ingin memuat file yang terletak di direktori yang sama dengan file batch, awali nama file dengan% ~ dp0. Berikut ini sebuah contoh:

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

NB:: Jika nama file atau direktori Anda (mis. Myfile.txt dalam contoh di atas) memiliki spasi (mis. 'File saya.txt' atau 'c: \ Program Files'), gunakan:

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

, dengan jenis kata kunci yang memanggil typeprogram, yang menampilkan konten file teks. Jika Anda tidak ingin mengalami overhead dalam pemanggilan perintah ketik, Anda harus mengubah direktori menjadi direktori file teks. Perhatikan bahwa jenis ini masih diperlukan untuk nama file dengan spasi.

Saya harap ini membantu seseorang!

Marvin Thobejane
sumber
Tidak perlu awalan nama file karena file batch akan terlihat di folder saat ini secara default.
foxidrive
1
@Foxidrive: Oke, saya mendengarmu. Meski harus diperhatikan. Sebagai contoh jika suatu direktori diubah, itu akan mencari di direktori itu daripada yang ada di file batch. Solusi kemudian akan memanggil **cd /d %~dp0**sebelum for for loop. Ini akan memastikan Anda mereferensikan file dalam direktori file batch masuk Terima kasih atas pengamatannya
Marvin Thobejane
2
Terima kasih dan +1 untuk typewalkaround
halex
Saya tidak bisa menyelesaikan typepekerjaan, saya harus mengutip nama file saya karena ada di direktori berbeda yang berisi spasi (Sialan Anda Program Files). Saya mendapatkan kesalahanThe system cannot find the file `type.
scragar
1
@scagar, apakah Anda mendapatkan penawaran yang tepat? harus berupa 'bukan'. Di keyboard saya ada pada tombol yang sama dengan @
FrinkTheBrave
18

Jawaban yang diterima baik, tetapi memiliki dua keterbatasan.
Ini menjatuhkan garis kosong dan garis yang dimulai dengan;

Untuk membaca baris konten apa pun, Anda memerlukan teknik toggling ekspansi yang tertunda.

@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 digunakan untuk mengawali setiap baris dengan nomor baris dan titik dua, sehingga baris kosong tidak lagi kosong.

DelayedExpansion perlu dinonaktifkan, ketika mengakses %%aparameter, tanda seru !dan tanda sisipan ^akan hilang, karena mereka memiliki arti khusus dalam mode itu.

Tetapi untuk menghapus nomor garis dari garis, ekspansi yang tertunda perlu diaktifkan.
set "var=!var:*:=!"menghapus semua hingga titik dua pertama (menggunakan delims=:akan menghapus juga semua titik dua pada awal baris, tidak hanya yang dari findstr).
Endlocal menonaktifkan ekspansi yang tertunda lagi untuk baris berikutnya.

Satu-satunya batasan sekarang adalah batas panjang garis ~ 8191, tetapi sepertinya tidak ada cara untuk mengatasinya.

jeb
sumber
Menang 10 tidak memungkinkan setlocalpada commandline. Ketika saya menjalankan kode pada CMD, saya dapatkan! Var! bukannya kosong. Bagaimana cara memperbaiki?
Zimba
batas panjang garis dapat diatasi dengan memisahkan file ke file temp dari panjang baris maks 8190 sebelum diproses. Kemudian rekombinasi menjadi satu file.
Zimba
14

Atau, Anda dapat mengecualikan opsi dalam kutipan:

FOR /F %%i IN (myfile.txt) DO ECHO %%i
Paul
sumber
1
Tanda dua persen di sebelah satu sama lain %% diperlakukan seperti tanda persen tunggal dalam suatu perintah (bukan file batch).
Paul
9

Ini file bat yang saya tulis untuk mengeksekusi semua skrip SQL dalam folder:

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

sumber
6

Jika Anda memiliki NT-keluarga Windows (satu dengan cmd.exesebagai shell), coba perintah FOR / F .

Michael Ratanapintha
sumber
6

Server yang diterima menggunakan cmd.exedan

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

hanya berfungsi untuk file "normal". Gagal gagal dengan file besar.

Untuk file besar, Anda mungkin perlu menggunakan Powershell dan sesuatu seperti ini:

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

atau jika Anda memiliki cukup memori:

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

Ini bekerja untuk saya dengan file 250 MB yang berisi lebih dari 2 juta baris, di mana for /F ...perintah macet setelah beberapa ribu baris.

Untuk perbedaan antara foreachdan ForEach-Object, lihat Mengenal ForEach dan ForEach-Object .

(kredit: Baca baris demi baris file di PowerShell )

mivk
sumber
1

Contoh modded di sini untuk daftar aplikasi Rails kami di Heroku - terima kasih!

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

Kode lengkap di sini .

sendbits
sumber
Per komentar untuk pertanyaan lain di atas - Anda dapat melewati pembuatan file / membaca dan hanya menggunakan for /f "tokens=1" %%i in ('find /v "=" heroku_apps.txt ^| find /v ".TXT" ^| findstr /r /v /c:"^$"') do...(Perhatikan penambahan ^digunakan untuk melarikan diri dari pipa, sehingga diteruskan ke fordan tidak langsung ke prosesor perintah)
user66001
0

Untuk mencetak semua baris dalam file teks dari baris perintah (dengan penundaan Perluasan):

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

Bekerja dengan spasi putih, garis kosong, garis spasi putih terkemuka.

Diuji pada Win 10 CMD

Zimba
sumber
Tuhan mencoba, tetapi sampel pertama Anda menghilangkan ]]]garis depan, sampel kedua menjatuhkan garis kosong dan garis yang dimulai dengan ruang
jeb
Yang ke-2 dimaksudkan untuk menghapus garis kosong. Yang pertama dapat memodifikasi delimsjika ada baris dalam file teks dimulai dengan ]mis. ganti dengan beberapa karakter yang tidak, atau karakter kontrol seperti backspace atau bell; mereka biasanya tidak ditemukan dalam file teks. Alasan untuk delims=]ini adalah untuk menghapus penampung yang dibuat oleh /ndari findperintah untuk melestarikan baris kosong.
Zimba
@ jeb: braket]]] masalah diperbaiki. Lihat pembaruan, untuk mencetak semua baris dalam file teks. Bekerja pada Win 10 CMD juga.
Zimba