Membagi perintah panjang dalam beberapa baris melalui file batch Windows

735

Bagaimana saya bisa membagi perintah panjang ke beberapa baris dalam file batch?

Ondra Žižka
sumber

Jawaban:

919

Anda dapat memecah garis panjang dengan tanda sisipan ^selama Anda ingat bahwa tanda tanda pada tanda kuret dan baris baru yang ada di dalamnya benar-benar dihapus. Jadi, jika harus ada ruang di mana Anda melanggar garis, sertakan ruang. ( Lebih lanjut tentang itu di bawah ini. )

Contoh:

copy file1.txt file2.txt

akan ditulis sebagai:

copy file1.txt^
 file2.txt
Wayne
sumber
95
Anda bisa memulai baris berikutnya tanpa spasi jika Anda menambahkan spasi sebelum ^dan setelah teks perintah Anda.
Joseph Daigle
4
@SebaIllingworth - Tidak, Anda selalu dapat menambahkan [SPACE] + [^] dan dua baris kosong untuk membuat total 2 umpan baris saat echoed.
James K
12
Untuk keselamatan selalu diakhiri dengan garis kosong saat menggunakan caret, lihat Karat sederhana dalam file batch menghabiskan semua memori
matt wilkie
4
@GavinMiller: "caret ^ setelah menyalin dan file1.txt pada baris baru tidak akan berfungsi" Itu tidak benar. Anda dapat membagi garis di mana saja, termasuk di tengah kata, seperti co^␍py ^␍file1 ^␍file2. Saya sarankan Anda menghapus komentar Anda untuk menghindari kebingungan, terutama karena pencarian ini sangat populer
Borodin
3
Satu gotcha di sini adalah bahwa ^ harus menjadi karakter terakhir pada baris - yaitu tidak ada spasi setelahnya. Saya mengalami masalah dengan ini dan ternyata saya memiliki banyak ruang setelah tanda sisipan - tidak mudah terlihat di editor yang saya gunakan.
GregHNZ
267

Aturan untuk caret adalah:

Tanda sisipan di akhir baris, tambahkan baris berikutnya, karakter pertama dari baris yang ditambahkan akan diloloskan.

Anda dapat menggunakan tanda sisir beberapa kali, tetapi garis lengkap tidak boleh melebihi panjang garis maksimum ~ 8192 karakter (Windows XP, Windows Vista, dan Windows 7).

echo Test1
echo one ^
two ^
three ^
four^
*
--- Output ---
Test1
one two three four*

echo Test2
echo one & echo two
--- Output ---
Test2
one
two

echo Test3
echo one & ^
echo two
--- Output ---
Test3
one
two

echo Test4
echo one ^
& echo two
--- Output ---
Test4
one & echo two

Untuk menekan keluarnya karakter berikutnya, Anda dapat menggunakan redirection.

Pengalihan harus tepat sebelum tanda sisipan. Tetapi ada satu keingintahuan dengan pengalihan sebelum tanda sisipan.

Jika Anda menempatkan token di caret, token tersebut dihapus.

echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two


echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two

Dan juga memungkinkan untuk menyematkan umpan baris ke dalam string:

setlocal EnableDelayedExpansion
set text=This creates ^

a line feed
echo Test7: %text%
echo Test8: !text!
--- Output ---
Test7: This creates
Test8: This creates
a line feed

Garis kosong itu penting untuk kesuksesan. Ini hanya berfungsi dengan ekspansi yang tertunda, jika tidak sisa baris akan diabaikan setelah umpan baris.

Ini berfungsi, karena tanda sisipan di ujung baris mengabaikan umpan baris berikutnya dan lolos dari karakter berikutnya, bahkan jika karakter berikutnya juga merupakan umpan baris (carriage return selalu diabaikan dalam fase ini).

jeb
sumber
Blok kode terakhir dengan contoh umpan baris tidak menampilkan baris kosong, meskipun ada di sana. (Setidaknya tidak muncul di IE7) Coba format ulang menggunakan blockquote.
dbenham
5
Pertanyaannya adalah, apakah kita harus mendukung alat yang buruk yang tidak mengikuti aturan (seseorang menyebutnya peramban, tetapi tidak) atau apakah Anda harus beralih ke peramban?
jeb
1
saya memiliki tanda kutip ganda mengelilingi nilai-nilai saya, seperti pada set var = "teks di sini ^" tetapi tidak berhasil. Hapus penawaran ganda dan tidak masalah.
rjt
1
@ jeb, menulis contoh skrip cmd yang gagal, tetapi kemudian menemukan pertanyaan ini: stackoverflow.com/questions/4643376/…
rjt
Ini tidak berfungsi jika baris berikutnya dimulai dengan tanda kutip: copy ^[newline]"file1.txt" ^[newline]"file2.txt"tidak berfungsi! Saya harus menambahkan spasi: copy ^[newline] "file1.txt" ^[newline] "file2.txt".
Alexander Gelbukh
70

(Ini pada dasarnya adalah penulisan ulang jawaban Wayne tetapi dengan kebingungan di sekitar tanda sisir menjadi jelas. Jadi saya telah mempostingnya sebagai CW. Saya tidak malu mengedit jawaban, tetapi sepenuhnya menulis ulang sepertinya tidak pantas.)

Anda dapat memecah garis-garis panjang dengan tanda sisipan ( ^), hanya ingat bahwa tanda sisipan dan baris baru yang mengikutinya dihapus seluruhnya dari perintah, jadi jika Anda meletakkannya di tempat spasi akan diperlukan (seperti antara parameter), pastikan untuk memasukkan ruang juga (baik sebelum ^, atau di awal baris berikutnya - bahwa pilihan terakhir dapat membantu membuatnya lebih jelas itu adalah kelanjutan).

Contoh: (semua diuji pada Windows XP dan Windows 7)

xcopy file1.txt file2.txt

dapat ditulis sebagai:

xcopy^
 file1.txt^
 file2.txt

atau

xcopy ^
file1.txt ^
file2.txt

atau bahkan

xc^
opy ^
file1.txt ^
file2.txt

(Yang terakhir berfungsi karena tidak ada spasi di antara xcdan dan ^, dan tidak ada spasi di awal baris berikutnya. Jadi, ketika Anda menghapus ^dan baris baru, Anda mendapatkan .... xcopy)

Untuk keterbacaan dan kewarasan, mungkin lebih baik melanggar hanya antara parameter (pastikan untuk memasukkan spasi).

Pastikan bahwa ^adalah tidak hal terakhir dalam sebuah file batch, karena ada tampaknya menjadi masalah besar dengan itu .

T.J. Crowder
sumber
18

Berbagai perintah dapat dimasukkan dalam tanda kurung dan tersebar di berbagai baris; jadi sesuatu seperti echo hi && echo hellobisa dimasukkan seperti ini:

( echo hi
  echo hello )

Juga variabel dapat membantu:

set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
  start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...

Saya juga memperhatikan dengan caret ( ^) bahwa ifconditional menyukai mereka untuk mengikuti hanya jika ada ruang:

if exist ^
Todd Partridge
sumber
1
Baris cmd1.bat && cmd2.batberbeda dari bentuk parens: mengeksekusi cmd2.batiff cmd1.batdieksekusi berhasil (-tanpa pengaturan %errorcode%). Bentuk terakhir dijalankan tanpa syarat. Agak tak terduga (setidaknya bagi saya) adalah bahwa, jelas, Anda tidak dapat menggunakan kombinasi keduanya yaitu menambahkan &&sebelum jeda baris.
Paul Michalik
( echo <line break here> hello )menghasilkan baris kosong.
Karl Morrison
jawaban terbaik dan terbersih! caret jelek dan bermasalah di regex
neoscribe
9

Namun tampaknya membelah di tengah-tengah nilai-nilai untuk loop tidak perlu tanda sisipan (dan benar-benar mencoba untuk menggunakan satu akan dianggap sebagai kesalahan sintaksis). Sebagai contoh,

for %n in (hello
bye) do echo %n

Perhatikan bahwa tidak ada ruang yang dibutuhkan setelah hello atau sebelum tinggal.

Mohammed Safwat
sumber
Tentu saja, ini adalah bagian dari forsintaksis: pemisah elemen dalam "untuk-set" adalah ruang, koma, titik koma, tanda sama, karakter TAB dan baris baru.
Aacini
Tetapi bagaimana jika dobagian itu berisi if-elsepernyataan banyak / bertumpuk ?
Vicky Dev
Kemudian Anda cukup menggunakan tanda kurung untuk melampirkan pernyataan seperti untuk% n di (hello bye) do (echo% n echo% n)
Mohammed Safwat