Saya ingin tahu cara mengulang setiap baris dalam file teks menggunakan file batch Windows dan memproses setiap baris teks secara berurutan.
windows
batch-file
Tuan Kraus
sumber
sumber
%%A
dengan%A
pada perintah di atas. Kalau tidak, Anda akan mendapatkan%%A was unexpected at this time.
.for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A
->A = myfile.txt
. Adakah ide bagaimana menggagalkan ini?Dari referensi baris perintah Windows:
Untuk mem-parsing file, mengabaikan baris komentar, ketik:
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:
sumber
usebackq
" :for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")
Dalam File Batch Anda HARUS menggunakan
%%
alih-alih%
: (Ketikhelp for
)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.
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.
sumber
Meningkatkan jawaban "FOR / F .." pertama: Yang harus saya lakukan adalah memanggil eksekusi setiap skrip yang terdaftar di MyList.txt, jadi itu bekerja untuk saya:
--OR, jika Anda ingin melakukannya di beberapa baris:
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:
sumber
@ 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:
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:
, dengan jenis kata kunci yang memanggil
type
program, 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!
sumber
**cd /d %~dp0**
sebelum for for loop. Ini akan memastikan Anda mereferensikan file dalam direktori file batch masuk Terima kasih atas pengamatannyatype
walkaroundtype
pekerjaan, saya harus mengutip nama file saya karena ada di direktori berbeda yang berisi spasi (Sialan AndaProgram Files
). Saya mendapatkan kesalahanThe system cannot find the file `type.
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.
Findstr digunakan untuk mengawali setiap baris dengan nomor baris dan titik dua, sehingga baris kosong tidak lagi kosong.
DelayedExpansion perlu dinonaktifkan, ketika mengakses
%%a
parameter, 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 (menggunakandelims=:
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.
sumber
setlocal
pada commandline. Ketika saya menjalankan kode pada CMD, saya dapatkan! Var! bukannya kosong. Bagaimana cara memperbaiki?Atau, Anda dapat mengecualikan opsi dalam kutipan:
sumber
Ini file bat yang saya tulis untuk mengeksekusi semua skrip SQL dalam folder:
sumber
Jika Anda memiliki NT-keluarga Windows (satu dengan
cmd.exe
sebagai shell), coba perintah FOR / F .sumber
Server yang diterima menggunakan
cmd.exe
danhanya berfungsi untuk file "normal". Gagal gagal dengan file besar.
Untuk file besar, Anda mungkin perlu menggunakan Powershell dan sesuatu seperti ini:
atau jika Anda memiliki cukup memori:
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
foreach
danForEach-Object
, lihat Mengenal ForEach dan ForEach-Object .(kredit: Baca baris demi baris file di PowerShell )
sumber
Contoh modded di sini untuk daftar aplikasi Rails kami di Heroku - terima kasih!
Kode lengkap di sini .
sumber
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 kefor
dan tidak langsung ke prosesor perintah)Untuk mencetak semua baris dalam file teks dari baris perintah (dengan penundaan Perluasan):
Bekerja dengan spasi putih, garis kosong, garis spasi putih terkemuka.
Diuji pada Win 10 CMD
sumber
]]]
garis depan, sampel kedua menjatuhkan garis kosong dan garis yang dimulai dengan ruangdelims
jika 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 untukdelims=]
ini adalah untuk menghapus penampung yang dibuat oleh/n
darifind
perintah untuk melestarikan baris kosong.