File batch: Bagaimana cara membaca file?


97

Bagaimana Anda dapat membaca file (teks atau biner) dari file batch? Ada cara untuk membacanya dalam mode biner atau mode teks?


@ RookieTEC9: ya, saya tahu bahwa itu adalah 2 hal yang sangat berbeda, tetapi saya membutuhkan jawaban yang berfungsi di msdos, bukan windows nt (atau versi yang lebih baru), juga pertanyaan ini ditanyakan 7 tahun yang lalu, ingatlah
Lucas Gabriel Sánchez

@ RookieTEC9: Saya pikir Anda benar, sudah lama sejak ini. Saya hanya akan menghapus tag ms-dos
Lucas Gabriel Sánchez

1
Anda dapat menggunakan perintah TYPE [fileName]untuk MS-Dos.
Roke

coba ini berhasil untuk saya - stackoverflow.com/a/31919715/4534414
Anurag_BEHS

Jawaban:


40

Anda dapat menggunakan perintah for:

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

Tipe

for /?

pada prompt perintah. Juga, Anda dapat mengurai file ini !


26
Ini adalah contoh yang cukup rumit, mengurai informasi yang sangat spesifik dari file teks yang diformat khusus, tanpa memberikan penjelasan apa pun. Sesuai for /?perintah akan mengurai setiap baris di myfile.txt, mengabaikan baris yang dimulai dengan titik koma, meneruskan token ke-2 dan ke-3 dari setiap baris ke badan for, dengan token yang dipisahkan oleh koma dan / atau spasi.
Martin Prikryl

3
Contoh Anda adalah dari bantuan cmd.exe. Anda harus menambahkan petunjuk untuk itu atau menyalin seluruh deskripsi.
Th. Thielemann

70

Di bawah cmd.exe gaya NT, Anda dapat melakukan perulangan melalui baris file teks dengan

FOR /F %i IN (file.txt) DO @echo %i

Ketik "bantuan untuk" pada prompt perintah untuk informasi lebih lanjut. (tidak tahu apakah itu berfungsi di "DOS" apa pun yang Anda gunakan)


22
Seharusnya begitu %%i.
Jim Fell

32
Perintah ini akan berhenti membaca baris jika menemukan karakter spasi. Saya akhirnya menggunakan FOR / F "token = *" %% i IN (file.txt) DO @ECHO %% i
Jason

9
Berhasil! dan Jika Anda menggunakan konsol coba% i jika Anda menggunakan file bat kemudian coba %% i.
Steven Du

41

FOR-LOOP umumnya berfungsi, tetapi ada beberapa masalah. FOR tidak menerima baris kosong dan baris dengan lebih dari ~ 8190 bermasalah. Perluasan hanya berfungsi andal, jika perluasan yang tertunda dinonaktifkan.

Deteksi CR / LF versus LF tunggal tampaknya juga sedikit rumit.
Karakter NUL juga bermasalah, karena FOR-Loop segera membatalkan pembacaan.

Oleh karena itu, pembacaan biner langsung tampaknya hampir tidak mungkin.

Masalah dengan garis kosong bisa diselesaikan dengan trik. Awali setiap baris dengan nomor baris, menggunakan perintah findstr, dan setelah membaca, hapus awalan tersebut.

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    ENDLOCAL
)

Beralih antara mengaktifkan dan menonaktifkan perluasan tertunda diperlukan untuk keamanan bekerja dengan string, seperti !atau ^^^xy!z.
Itu karena garis set "var=%%a"hanya aman dengan DisabledDelayedExpansion , jika tidak, tanda seru dihapus dan tanda sisipan digunakan sebagai karakter escape (sekunder) dan juga dihapus.
Tetapi menggunakan variabel varhanya aman dengan EnabledDelayedExpansion , karena bahkan call %%var%%akan gagal dengan konten seperti "&"&.

EDIT: Menambahkan varian set / p
Ada cara kedua untuk membaca file dengan set /p, satu-satunya kelemahan adalah bahwa itu dibatasi hingga ~ 1024 karakter per baris dan menghapus karakter kontrol di akhir baris.
Tetapi keuntungannya adalah, Anda tidak memerlukan toggling yang tertunda dan lebih mudah untuk menyimpan nilai dalam variabel

@echo off
setlocal EnableDelayedExpansion
set "file=%~1"

for /f "delims=" %%n in ('find /c /v "" %file%') do set "len=%%n"
set "len=!len:*: =!"

<%file% (
  for /l %%l in (1 1 !len!) do (
    set "line="
    set /p "line="
    echo(!line!
  )
)

Untuk membacanya "biner" menjadi representasi hex
Anda dapat melihat SO: mengonversi file biner ke representasi HEX menggunakan file batch


Terima kasih atas petunjuk tentang penggunaan set /p. Saya biasa set /p value=< result.txtmendapatkan baris pertama dari file teks
SteveC

Jeb, saya mengajukan pertanyaan terkait berdasarkan solusi Anda di atas di stackoverflow.com/questions/11408295/…
Nicholas

Bagaimana dengan karakter EOF (end-of-file), ASCII 0x1A? tidak for /Fberperilaku dengan cara yang sama seperti dengan NUL ( 0x00) karakter?
aschipfl

@aschipfl Saya kira 0x1A berperilaku dalam beberapa kasus seperti linefeed (atau lebih baik diterjemahkan ke linefeed). Apakah ada cara untuk membuat SUB tanpa menggunakan file temp?
jeb

ini harus menjadi jawaban yang diterima, itu sangat mudah bahkan jika baris dimulai dengan :atau ;atau mengandung!
HackingAddict1337

11

Salah satu cara yang sangat mudah untuk melakukannya adalah dengan menggunakan perintah berikut:

set /p mytextfile=< %pathtotextfile%\textfile.txt
echo %mytextfile%

Ini hanya akan menampilkan baris pertama teks dalam file teks. Cara lain Anda dapat melakukannya adalah menggunakan perintah berikut:

type %pathtotextfile%\textfile.txt

Ini akan menempatkan semua data dalam file teks di layar. Semoga ini membantu!


1

Ada banyak cara berbeda tetapi jika Anda hanya ingin MENAMPILKAN teks dan tidak MENYIMPANnya di mana saja maka Anda cukup menggunakan: findstr /v "randomtextthatnoonewilluse" filename.txt


0

Kode yang diperbaiki:

setlocal enabledelayedexpansion
for /f "usebackq eol= tokens=* delims= " %%a in (`findstr /n ^^^^ "name with spaces.txt"`) do (
    set line=%%a
    set "line=!line:*:=!"
    echo(!line!
)
endlocal
pause

Dari kode utama halaman. Kutipan tidak ditempatkan dengan benar, kode tidak cocok untuk file dengan nama dengan spasi. Punya saya. Saya berikan di sini trik ^^^^
Celes

Anda benar dengan tanda kutip di sekitar nama file, tetapi kode Anda memiliki beberapa masalah: eol=dan delims=tidak berguna, set line=%%aharus menggunakan tanda kutip dan tanpa mengaktifkan mode perluasan tertunda, kode tidak dapat membaca tanda seru
jeb

-5

Kode yang menampilkan konten file myfile.txt di layar

set% filecontent% = 0
ketik% nama file% >>% filecontent%
echo% filecontent%


3
tolong setidaknya coba kode sebelum memposting. Itu tidak masuk akal.
Stephan

Apa yang terjadi disini? Saya tidak masuk akal
Gerhard
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.