Bagaimana Anda bisa memasukkan baris baru dari output file batch Anda?
Saya ingin melakukan sesuatu seperti:
echo hello\nworld
Yang akan menghasilkan:
hello
world
echo Yes&echo No
Bagaimana Anda bisa memasukkan baris baru dari output file batch Anda?
Saya ingin melakukan sesuatu seperti:
echo hello\nworld
Yang akan menghasilkan:
hello
world
echo Yes&echo No
Jawaban:
echo hello & echo.world
Ini berarti Anda dapat mendefinisikan & echo.
sebagai konstanta untuk baris baru \n
.
echo. && echo hello && echo. && echo world
$ (echo Hello && echo World) > ./File.txt
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 /
Menggunakan:
echo hello
echo.
echo world
echo "Makefile contents (which has \n)" > Makefile
Dengan beberapa gema, itu tidak akan berhasil
(echo hello & echo world) >> ./test.txt
echo line 1 > Makefile
dan kemudian echo line 2 >> Makefile
. Penggunaan >>
penyebab output ditambahkan ke file, yang merupakan perilaku yang Anda butuhkan untuk kasus ini.
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.
set nl=^&echo.
, maka hanya echo hello %nl% world
menghasilkan efek yang sama.
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
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.
ECHO(
gagal.
echo
, dan apa pengaruhnya?"
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%Line2
akan 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 echo
yang 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 ECHO
dan 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.
call :pause line1!\n!line2
, mulailah subrutin dengan setlocal EnableDelayedExpansion
dan akhiri dengan setlocal DisableDelayedExpansion
agar baris baru tidak ditafsirkan secara prematur.
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.
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 \n
digunakan dalam berbagai bahasa.
Kerusakan
set n=
set variabel n
sama 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
echo.
saat pertama kali mencoba menemukan file dengan nama itu. Gunakan tanda baca lain, sepertiecho,
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
(echo hello && echo world) > temp
disebutkan oleh Nathan J. Brauer dalam komentar atas karya jawaban yang diterima saat ini.
Seperti yang Grimtron sarankan - berikut ini adalah contoh cepat untuk mendefinisikannya:
@echo off
set newline=^& echo.
echo hello %newline%world
C:\>test.bat
hello
world
echo hello %newline%world
garis tidak ada spasi di antara keduanya.
echo "Hello %newline% world"
gagal karena ada di dalam tanda kutip. Karena itu bukan nyata baris baru.
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)
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 :)
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.
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 . . .
echo asdf >myfile.txt
akan menghasilkan hasil yang sama persis. echo
menambahkan baris baru ke akhir string.
Untuk memulai baris baru dalam batch, yang harus Anda lakukan adalah menambahkan "echo [", seperti:
echo Hi!
echo[
echo Hello!
echo[.bat
echo.
juga merupakan solusi yang buruk.
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.
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
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.
ECHO ist eingeschaltet (ON).
tidak mendapat baris kosong, mencoba di cmd-prompt
Solusi ini berfungsi (Diuji):
type nul | more /e /p
Ini mengonversi umpan baris yang terisolasi ke kombinasi umpan saluran balik carriage.
echo hello \n world