Bagaimana saya bisa menggemakan baris baru dalam file batch?

642

Bagaimana Anda bisa memasukkan baris baru dari output file batch Anda?

Saya ingin melakukan sesuatu seperti:

echo hello\nworld

Yang akan menghasilkan:

hello
world
Brian R. Bondy
sumber
6
Datang berguna bagi saya. Saya harus melakukan echo \ n \ n | my_app.exe dalam sebuah skrip. Saya melakukannya (gema. && gema.) | my_app.exe
Vignesh
2
Pendekatan Mudah "Kode dimulai:"> halo gema & dunia gema, akan memberikan apa yang Anda butuhkan
prudviraj
1
Anda dapat memasukkan ascii chr (255) yang tidak terlihat pada baris terpisah yang akan memaksa baris baru yang kosong. Tahan tombol [alt] dan tekan 255 pada keypad. sisipan ini chr (255) yang merupakan kotak kosong. yaitu " echo (alt + 255) " Anda hanya dapat menggunakan keypad dan bukan angka di bagian atas keyboard querty!
jwzumwalt
Sama seperti setengah dari perbaikan komputer yang menghubungkannya dan menyalakannya, setengah dari pengembangan perangkat lunak adalah apa yang saya sebut rekayasa ruang . Kami membutuhkan garis kosong kami begitu saja.
Bob Stein
Bagaimana dengan ini ? echo Yes&echo No
scientist_7

Jawaban:

462

echo hello & echo.world

Ini berarti Anda dapat mendefinisikan & echo.sebagai konstanta untuk baris baru \n.

Grimtron
sumber
43
contoh tidak perlu titik, tetapi Anda perlu satu untuk menggemakan baris kosong kosong:echo. && echo hello && echo. && echo world
matt wilkie
4
Bisakah Anda melakukan ini dengan satu gema sehingga dapat diarahkan ke file?
Shahbaz
46
@ Shahbaz -$ (echo Hello && echo World) > ./File.txt
Nathan JB
25
Periode hal dalam "gema." tidak pernah berhenti membuatku kagum. Ini sangat tanggal, dan masih saya selalu lupa bahwa titik harus benar-benar digabungkan dengan nama perintah, tanpa spasi di antaranya. Tidak ada kesalahan dalam posting Anda, saya menulis ini hanya sebagai pengingat: "echo." ! = "echo." !
quetzalcoatl
5
@quetzalcoatl, itu semakin aneh. Karakter lain selain titik juga bekerja. SS64 mengatakan sintaks yang lebih baik adalah echo(untuk meningkatkan kinerja (masih tanpa ruang pikiran Anda). Diskusi diperpanjang karakter lain dan kelebihan / kekurangan mereka di ECHO. GAGAL untuk memberikan teks atau baris kosong - Alih-alih menggunakan ECHO /
matt wilkie
558

Menggunakan:

echo hello
echo.
echo world
Matt Lacey
sumber
16
Apakah mungkin sambil memberikan string dalam satu pernyataan gema?
Brian R. Bondy
5
Mengapa Anda perlu melakukannya dengan satu pernyataan gema; di mana salahnya memiliki yang lain?
Rob
3
@ Rob, saya baru saja menemukan masalah ini dan tidak ada yang berhasil. Anda perlu menggema dalam satu pernyataan dalam contoh saya. Saya membuat beberapa file tex dari HTML dan membuat Makefile dengan menggunakan echo "Makefile contents (which has \n)" > MakefileDengan beberapa gema, itu tidak akan berhasil
Shahbaz
3
Gunakan & (atau &&) untuk melakukannya dalam satu pernyataan: Misalnya, untuk memasukkan "hello \ nworld" dalam file txt:(echo hello & echo world) >> ./test.txt
Ned Martin
4
Untuk output multi-baris ke file mengapa tidak melakukan hal berikut? echo line 1 > Makefiledan kemudian echo line 2 >> Makefile. Penggunaan >>penyebab output ditambahkan ke file, yang merupakan perilaku yang Anda butuhkan untuk kasus ini.
dgnuff
141

Ini dia, buat file .bat dengan yang berikut di dalamnya:

@echo off
REM Creating a Newline variable (the two blank lines are required!)
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%
REM Example Usage:
echo There should be a newline%NL%inserted here.

echo.
pause

Anda akan melihat output seperti berikut:

There should be a newline
inserted here.

Press any key to continue . . .

Anda hanya perlu kode antara pernyataan REM, jelas.

jeb
sumber
51
Sangat mengesankan, dapatkah Anda meluangkan waktu untuk menjelaskan bagaimana set baris NL = ^^^% NLM %% NLM% ^% NLM %% NLM% bekerja? Aku tidak bisa mendapatkan saya bulat kepala itu
Andy Morris
8
@andy methinks a +8 comment menjamin pertanyaan: stackoverflow.com/questions/6379619/…
matt wilkie
82
Ini adalah contoh yang bagus untuk menunjukkan bahwa file batch cmd.exe dan Windows benar-benar gila!
mivk
12
CATATAN UNTUK DIRI: Baris "set NLM = ^" harus tidak memiliki apa-apa setelah CARET dan harus memiliki 2 baris kosong setelahnya.
mnemotronic
4
Lihat jawaban saya untuk metode yang lebih sederhana. set nl=^&echo., maka hanya echo hello %nl% worldmenghasilkan efek yang sama.
coltonon
96

Ada fitur standar echo:dalam file cmd / bat untuk menulis baris kosong, yang mengemulasi baris baru di cmd-output Anda:

@echo off
@echo line1
@echo:
@echo line2

Output dari cmd file yang dikutip di atas:

line1

line2
makropas
sumber
37
Bahkan, setiap char khusus yang tidak digunakan harus bekerja. Saya selalu menganjurkan penggunaan / karena slash adalah karakter standar untuk opsi perintah. Juga, saya selalu mengkritik penggunaan titik yang seseorang di Microsoft sayangnya pilih karena perintah: echo.com memberikan hasil yang berbeda tergantung pada versi MS-DOS / Windows Batch command processor.
Aacini
21
Satu-satunya versi yang selalu berfungsi adalah echo(. Sepertinya itu bisa menyebabkan masalah, tetapi sebenarnya berfungsi dengan baik. Semua bentuk lain memiliki setidaknya satu situasi di mana perintah tidak akan melakukan yang diinginkan.
dbenham
5
@naxa - Tidak ada yang resmi, hanya pengetahuan kolektif yang diperoleh oleh beberapa peretas. Tujuannya adalah untuk memiliki sintaks yang dapat digunakan untuk nilai ECHO apa pun, termasuk tidak ada, dan tidak perlu khawatir mendapatkan apa pun selain dari yang diharapkan. Ringkasan terbaik yang saya ketahui adalah di dostips.com/forum/viewtopic.php?p=4554#p4554 . Agak membuat Anda tergantung, tetapi tidak ada yang pernah datang dengan skenario di mana ECHO(gagal.
dbenham
2
@Pacerier - ada contoh kegagalan untuk setiap saran tersebut. Baca dengan cermat dostips.com/forum/viewtopic.php?p=4554#p4554 .
dbenham
2
@ Peracerier, ada cukup gema yang terjadi di sini untuk pertanyaan mandiri. Mungkin sesuatu di sepanjang baris "karakter apa yang dapat segera diikuti echo, dan apa pengaruhnya?"
matt wilkie
68

Seperti jawaban Ken, tetapi dengan penggunaan ekspansi yang tertunda.

setlocal EnableDelayedExpansion
(set \n=^
%=Do not remove this line=%
)

echo Line1!\n!Line2
echo Works also with quotes "!\n!line2"

Pertama-tama satu karakter linefeed dibuat dan ditugaskan ke variabel \ n.
Ini berfungsi sebagai tanda sisipan di garis akhir mencoba untuk melarikan diri dari karakter berikutnya, tetapi jika ini adalah Linefeed itu diabaikan dan karakter berikutnya dibaca dan melarikan diri (bahkan jika ini juga merupakan linefeed).
Maka Anda membutuhkan umpan baris ketiga untuk mengakhiri instruksi saat ini, jika tidak baris ketiga akan ditambahkan ke variabel LF.
Bahkan file batch memiliki akhiran baris dengan CR / LF hanya LF yang penting, karena CR dihapus pada fase parser ini.

Keuntungan menggunakan ekspansi yang tertunda adalah, tidak ada penanganan karakter khusus sama sekali.
echo Line1%LF%Line2akan gagal, karena parser berhenti mengurai pada satu baris feed.

Penjelasan lebih lanjut ada di
SO: Perintah panjang dipecah menjadi beberapa baris dalam file Vista / DOS batch (.bat)
SO: Bagaimana cara parse scripts Windows Command Interpreter (CMD.EXE)?

Sunting: Hindari echo.

Ini tidak menjawab pertanyaan, karena pertanyaannya adalah tentang tunggal echoyang dapat menghasilkan beberapa baris.

Tetapi terlepas dari jawaban lain yang menyarankan penggunaan echo.untuk membuat baris baru, harus dicatat bahwa itu echo.adalah yang terburuk, karena sangat lambat dan dapat gagal total, ketika cmd.exe mencari file bernama ECHOdan mencoba memulainya.

Untuk mencetak hanya baris kosong, Anda bisa menggunakan salah satunya

echo,
echo;
echo(
echo/
echo+
echo=

Tetapi penggunaan echo., echo\atau echo:harus dihindari, karena bisa sangat lambat, tergantung lokasi di mana skrip akan dieksekusi, seperti drive jaringan.

jeb
sumber
1
Jika Anda akan meneruskan string dengan baris baru sebagai parameter ke subrutin batch, misalnya call :pause line1!\n!line2, mulailah subrutin dengan setlocal EnableDelayedExpansiondan akhiri dengan setlocal DisableDelayedExpansionagar baris baru tidak ditafsirkan secara prematur.
stevek_mcc
2
+1 untuk pemeran karakter echo, echo; echo( echo/ echo+ echo=dan galeri penyamun echo. echo\ echo:. Sekarang jika Anda harus menjelaskan mengapa di tempat suci ini bekerja, saya akan berutang bir gratis.
Bob Stein
40

echo. Cukup kata.

Jika Anda membutuhkannya dalam satu baris, gunakan &. Sebagai contoh,

echo Line 1 & echo. & echo line 3

akan menampilkan sebagai:

Line 1

line 3

Sekarang, katakan Anda ingin sesuatu yang sedikit lebih mewah, ...

set n=^&echo.
echo hello %n% world

Keluaran

hello
world

Kemudian cukup masukkan %n%setiap kali Anda ingin baris baru dalam pernyataan gema. Ini lebih dekat dengan Anda \ndigunakan dalam berbagai bahasa.

Kerusakan

set n=set variabel nsama dengan:

^ Nulls keluar simbol berikutnya untuk mengikuti:

&Berarti melakukan perintah lain pada baris yang sama. Kami tidak peduli tentang tingkat kesalahan (ini merupakan pernyataan gema untuk menangis dengan suara keras), jadi tidak &&diperlukan.

echo. Melanjutkan pernyataan gema.

Semua ini berfungsi karena Anda benar-benar dapat membuat variabel yang merupakan kode, dan menggunakannya di dalam perintah lain. Ini semacam fungsi ghetto, karena batch bukan merupakan bahasa skrip shell yang paling canggih. Ini hanya berfungsi karena batch penggunaan variabel yang buruk, tidak menunjuk antara int, karakter, float, string, dll secara alami.

Jika Anda licik, Anda bisa membuatnya bekerja dengan hal-hal lain. Misalnya, menggunakannya untuk menggemakan tab

set t=^&echo.     ::there are spaces up to the double colon
titik dua
sumber
7
Jangan gunakan echo.saat pertama kali mencoba menemukan file dengan nama itu. Gunakan tanda baca lain, sepertiecho,
Reinstate Monica
20

Saat menggemakan sesuatu untuk mengarahkan ulang ke file, beberapa perintah gema tidak akan berfungsi. Saya pikir mungkin pengalih arah ">>" adalah pilihan yang baik:

echo hello> temp
dunia gema >> temp
Raja Crend
sumber
8
Contoh pertama, menggunakan ">", akan membuat file baru, yang kedua, menggunakan ">>", akan ditambahkan ke file yang sudah ada (atau buat jika belum ada).
Yann Duran
1
(echo hello && echo world) > tempdisebutkan oleh Nathan J. Brauer dalam komentar atas karya jawaban yang diterima saat ini.
GeroldBroser mengembalikan Monica
15

Seperti yang Grimtron sarankan - berikut ini adalah contoh cepat untuk mendefinisikannya:

@echo off
set newline=^& echo.
echo hello %newline%world

Keluaran

C:\>test.bat
hello
world
Peter Mortensen
sumber
Ini benar-benar akan menggemakan baris baru tambahan setelah "dunia"
BlueRaja - Danny Pflughoeft
1
@blue baris tambahan sepertinya menjadi fungsi dari file batch itu sendiri. Jika Anda mengulangi echo hello %newline%worldgaris tidak ada spasi di antara keduanya.
matt wilkie
2
echo "Hello %newline% world"gagal karena ada di dalam tanda kutip. Karena itu bukan nyata baris baru.
jeb
14

Jika Anda perlu meletakkan hasil ke file, Anda dapat menggunakan

(echo a & echo. & echo b) > file_containing_multiple_lines.txt
test30
sumber
9

Anda juga bisa melakukan ini,

(for %i in (a b "c d") do @echo %~i)

Outputnya adalah,

a
b
c d

Perhatikan bahwa ketika ini dimasukkan ke dalam file batch, '%' akan digandakan.

(for %%i in (a b "c d") do @echo %%~i)
albert
sumber
Solusi ini juga berfungsi jika Anda ingin menggaungkan ampersand & bukannya baris baru.
parvus
saya pikir saya menemukan bug: *char
7

Jika ada yang datang ke sini karena mereka ingin menggaungkan baris kosong dari makefile MINGW, saya menggunakan

@cmd /c echo.

hanya menggunakan echo.menyebabkan process_begin: CreateProcess(NULL, echo., ...) failed.pesan kesalahan yang ditakuti .

Saya harap ini membantu setidaknya satu orang di luar sana :)

Wayne Uroda
sumber
Tapi itu bukan pertanyaannya. Turunkan suara!
Mesalcode
Tidak yakin apakah sarkasme atau tidak: P
Wayne Uroda
Cari tahu dengan melihat di kotak masuk Anda: D
Mesalcode
3

Jika seseorang perlu menggunakan \ n yang terkenal dalam string literal yang dapat diteruskan ke variabel, dapat menulis kode seperti dalam skrip Hello.bat di bawah ini:

@echo off
set input=%1
if defined input (
    set answer=Hi!\nWhy did you call me a %input%?
) else (
    set answer=Hi!\nHow are you?\nWe are friends, you know?\nYou can call me by name.
)

setlocal enableDelayedExpansion
set newline=^


rem Two empty lines above are essential
echo %answer:\n=!newline!%

Dengan cara ini, output multiline dapat disiapkan di satu tempat, bahkan di file scritpt atau eksternal lainnya, dan dicetak di tempat lain.

Jeda baris diadakan dalam variabel baris baru . Nilainya harus diganti setelah para gema garis diperluas jadi saya menggunakan enableDelayedExpansion setlocal untuk memungkinkan tanda-tanda seru yang memperluas variabel pada eksekusi. Dan pengganti eksekusi \ n dengan konten baris baru (cari sintaks pada set bantuan ). Tentu saja kita dapat menggunakan ! Baris baru! saat mengatur jawaban tetapi \ n lebih mudah. Ini dapat diteruskan dari luar (coba Hello R2 \ nD2 ), di mana tidak ada yang tahu nama variabel yang menahan baris (Ya, Hello C3! Baris baru! P0 bekerja dengan cara yang sama).

Contoh di atas dapat disempurnakan menjadi subrutin atau batch mandiri, digunakan seperti call:mlecho Hi\nI'm your comuter:

:mlecho
setlocal enableDelayedExpansion
set text=%*
set nl=^


echo %text:\n=!nl!%
goto:eof

Harap dicatat, bahwa backslash tambahan tidak akan mencegah skrip mem-parsing \ n substring.

Tomator
sumber
1
Anda pada dasarnya melakukan hal yang sama dengan jawaban Jeb di atas.
Squashman
Jawaban yang saya baca di atas sangat membantu tetapi saya perlu memanggil skrip od subrutin yang akan diuraikan \ n jadi saya akan menghindari penerapan trik ini di mana-mana. Ini perlu untuk memperbaiki solusi dan saya membagikan penyempurnaan ini. Semoga itu tidak membahayakan binatang.
Tomator
2

Ini bekerja untuk saya, tidak perlu ekspansi yang tertunda:

@echo off
(
echo ^<html^> 
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause

Itu menulis output seperti ini:

<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
NahuelGQ
sumber
4
-1 echo asdf >myfile.txtakan menghasilkan hasil yang sama persis. echomenambahkan baris baru ke akhir string.
BlueRaja - Danny Pflughoeft
2
Jawaban bagus, menjadi satu-satunya orang yang mengakui nilai menggunakan tanda kurung untuk baris baru. Saya percaya ini adalah cara pembuat DOS menginginkan Anda untuk melakukannya.
djangofan
2

Untuk memulai baris baru dalam batch, yang harus Anda lakukan adalah menambahkan "echo [", seperti:

echo Hi!
echo[
echo Hello!
PryroTech
sumber
5
Ini lambat dan gagal ketika ada file dengan namaecho[.bat
jeb
Apa? Ini seharusnya bekerja secara instan, dan juga cukup menghapus file [file bat. Echo
PryroTech
2
Ini hampir sama persis dengan gema. sintaksis.
PryroTech
5
Ya dan echo.juga merupakan solusi yang buruk.
jeb
1
Seperti yang dapat dilihat pada jawaban sebelumnya, ini akan mencoba mencari file pada path terlebih dahulu, yang menyebabkannya menjadi sangat lambat. Hal yang sama berlaku untuk echo.. Mengharapkan pengguna skrip Anda untuk menghapus file di sistem mereka hanya karena skrip Anda memerlukan baris baru tidak terdengar seperti desain yang bagus untuk saya.
Abel
2

Solusi Ken dan Jeb bekerja dengan baik.

Tetapi baris baru dihasilkan dengan hanya karakter LF dan saya perlu karakter CRLF (versi Windows).

Untuk ini, di akhir skrip, saya telah mengkonversi LF ke CRLF.

Contoh:

TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt
otaviodecampos
sumber
0

Anda dapat menggunakan @echo(@echo + [spasi] + [ruang tidak aman])

Catatan: Ruang insecable dapat diperoleh dengan Alt + 0160

Semoga bermanfaat :)

[Sunting] Hmm Anda benar, saya membutuhkannya di Makefile, itu berfungsi dengan baik di sana. Saya kira jawaban saya tidak disesuaikan untuk file batch ... Buruk saya.

johan d
sumber
Saya ECHO ist eingeschaltet (ON).tidak mendapat baris kosong, mencoba di cmd-prompt
jeb
1
Itu adalah ruang yang tidak melanggar, bukan baris baru.
Ry-
0

Solusi ini berfungsi (Diuji):

type nul | more /e /p

Ini mengonversi umpan baris yang terisolasi ke kombinasi umpan saluran balik carriage.

Wasif Hasan
sumber
Tapi bagaimana ini menambahkan baris baru di antara teks? Pertanyaannya adalah tentangecho hello \n world
jeb
Downvote dari saya. Ini bukan jawaban untuk pertanyaan
Mesalcode
-2

Saya tidak bisa membuatnya lebih sederhana dari:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat
strance
sumber