Saya ingin tahu cara mengulang setiap baris dalam file teks menggunakan file batch Windows dan memproses setiap baris teks secara berurutan.
Saya ingin tahu cara mengulang setiap baris dalam file teks menggunakan file batch Windows dan memproses setiap baris teks secara berurutan.
Jawaban:
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.
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
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:
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"
usebackq
" : for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")
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.
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---
@ 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 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!
**cd /d %~dp0**
sebelum for for loop. Ini akan memastikan Anda mereferensikan file dalam direktori file batch masuk Terima kasih atas pengamatannya
type
walkaround
type
pekerjaan, 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.
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 %%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 (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.
setlocal
pada commandline. Ketika saya menjalankan kode pada CMD, saya dapatkan! Var! bukannya kosong. Bagaimana cara memperbaiki?
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
Jika Anda memiliki NT-keluarga Windows (satu dengan cmd.exe
sebagai shell), coba perintah FOR / F .
Server yang diterima menggunakan cmd.exe
dan
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 foreach
dan ForEach-Object
, lihat Mengenal ForEach dan ForEach-Object .
(kredit: Baca baris demi baris file di PowerShell )
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 .
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 for
dan tidak langsung ke prosesor perintah)
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
]]]
garis depan, sampel kedua menjatuhkan garis kosong dan garis yang dimulai dengan ruang
delims
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 untuk delims=]
ini adalah untuk menghapus penampung yang dibuat oleh /n
dari find
perintah untuk melestarikan baris kosong.
%%A
dengan%A
pada perintah di atas. Kalau tidak, Anda akan mendapatkan%%A was unexpected at this time.
.