แยกคำสั่งยาวเป็นหลายบรรทัดผ่านไฟล์แบตช์ของ Windows


735

ฉันจะแบ่งคำสั่งแบบยาวเป็นหลายบรรทัดในแบตช์ไฟล์ได้อย่างไร

คำตอบ:


919

คุณสามารถแยกบรรทัดยาวออกด้วยเครื่องหมายรูปหมวก^ตราบเท่าที่คุณจำได้ว่าเครื่องหมายรูปหมวกและขึ้นบรรทัดใหม่หลังจากนั้นจะถูกลบออกอย่างสมบูรณ์ ดังนั้นหากควรมีช่องว่างที่คุณแบ่งเส้นรวมช่องว่าง ( เพิ่มเติมในด้านล่าง )

ตัวอย่าง:

copy file1.txt file2.txt

จะเขียนเป็น:

copy file1.txt^
 file2.txt

95
คุณสามารถเริ่มบรรทัดถัดไปได้โดยไม่ต้องเว้นวรรคหากคุณเพิ่มช่องว่างก่อน^และหลังข้อความคำสั่งของคุณ
โจเซฟไดเกิล

4
@SebaIllingworth - ไม่คุณสามารถเพิ่ม [SPACE] + [^] และบรรทัดว่างสองบรรทัดเพื่อสร้างฟีดทั้งหมด 2 บรรทัดเมื่อถูกechoแก้ไข
James K

12
เพื่อความปลอดภัยมักจะลงท้ายด้วยบรรทัดว่างเมื่อใช้ carets ให้ดูที่carat แบบง่ายในไฟล์แบตช์ใช้หน่วยความจำทั้งหมด
matt wilkie

4
@GavinMiller: "caret ^ หลังจากคัดลอกและ file1.txt ในบรรทัดใหม่จะไม่ทำงาน"นั่นไม่เป็นความจริง co^␍py ^␍file1 ^␍file2คุณสามารถแยกได้ทุกสายรวมทั้งในช่วงกลางของคำเช่น ฉันขอแนะนำให้คุณลบความคิดเห็นของคุณเพื่อหลีกเลี่ยงความสับสนโดยเฉพาะอย่างยิ่งการแสวงหานี้เป็นที่นิยมอย่างหนึ่ง
Borodin

3
หนึ่ง gotcha ที่นี่คือ ^ จะต้องเป็นตัวละครตัวสุดท้ายในบรรทัด - คือไม่มีช่องว่างหลังจากนั้น ฉันมีปัญหากับเรื่องนี้และกลายเป็นว่าฉันมีช่องว่างมากมายหลังจากคาเร็ต - ไม่สามารถมองเห็นได้ง่ายในเครื่องมือแก้ไขที่ฉันใช้
GregHNZ

266

กฎสำหรับคาเร็ตคือ:

เครื่องหมายรูปหมวกที่ท้ายบรรทัดต่อท้ายบรรทัดถัดไปอักขระตัวแรกของบรรทัดต่อท้ายจะถูก Escape

คุณสามารถใช้เครื่องหมายรูปหมวกได้หลายครั้ง แต่เส้นที่สมบูรณ์ต้องไม่เกินความยาวบรรทัดสูงสุดของอักขระที่ ~ 8192 (Windows XP, Windows Vista และ 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

เพื่อป้องกันการหลบหนีของตัวละครถัดไปคุณสามารถใช้การเปลี่ยนเส้นทาง

การเปลี่ยนเส้นทางจะต้องอยู่ก่อนเครื่องหมายรูปหมวก แต่มีอยู่หนึ่งอยากรู้อยากเห็นด้วยการเปลี่ยนเส้นทางก่อนที่เครื่องหมาย

หากคุณวางโทเค็นไว้ที่เครื่องหมายรูปหมวกโทเค็นจะถูกลบออก

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


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

และยังสามารถฝังตัวดึงข้อมูลบรรทัดลงในสายอักขระ:

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

บรรทัดว่างมีความสำคัญต่อความสำเร็จ สิ่งนี้ใช้ได้เฉพาะกับการขยายที่ล่าช้ามิฉะนั้นส่วนที่เหลือของบรรทัดจะถูกข้ามหลังจากป้อนบรรทัด

ใช้งานได้เนื่องจากคาเร็ตที่ปลายบรรทัดละเว้นฟีดบรรทัดถัดไปและหนีอักขระถัดไปแม้ว่าอักขระถัดไปจะเป็นฟีดบรรทัด (การขึ้นบรรทัดใหม่จะถูกละเว้นในเฟสนี้เสมอ)


บล็อกโค้ดสุดท้ายพร้อมกับตัวอย่างการป้อนบรรทัดไม่แสดงบรรทัดว่างแม้ว่าจะมีอยู่ก็ตาม (อย่างน้อยก็ไม่แสดงใน IE7) ลองฟอร์แมตใหม่โดยใช้ blockquote แทน
dbenham

5
คำถามคือเราควรสนับสนุนเครื่องมือที่ไม่ดีที่ไม่ปฏิบัติตามกฎ (มีคนเรียกมันว่าเบราว์เซอร์ แต่ไม่ใช่) หรือคุณควรเปลี่ยนไปใช้เบราว์เซอร์หรือไม่?
jeb

1
ฉันมีเครื่องหมายคำพูดคู่ล้อมรอบค่าของฉันเช่นเดียวกับใน set var = "text here ^" แต่มันไม่ทำงาน ลบเครื่องหมายคำพูดคู่และมันก็ดี
rjt

1
@jeb เขียนตัวอย่างสคริปต์ cmd ที่ล้มเหลว แต่พบคำถามนี้แล้ว: stackoverflow.com/questions/4643376/…
rjt

สิ่งนี้จะไม่ทำงานหากบรรทัดถัดไปเริ่มต้นด้วยเครื่องหมายคำพูด: copy ^[newline]"file1.txt" ^[newline]"file2.txt"ไม่ทำงาน! ฉันต้องเพิ่มช่องว่าง: copy ^[newline] "file1.txt" ^[newline] "file2.txt".
Alexander Gelbukh

70

(นี่เป็นคำตอบที่เขียนซ้ำของWayneแต่ด้วยความสับสนรอบคาเร็ตดังนั้นฉันโพสต์มันเป็น CW ฉันไม่อายที่จะแก้ไขคำตอบ แต่การเขียนใหม่ทั้งหมดดูเหมือนจะไม่เหมาะสม)

คุณสามารถแยกบรรทัดที่ยาวขึ้นด้วยเครื่องหมายคาเร็ต ( ^) เพียงจำไว้ว่าเครื่องหมายรูปหมวกและขึ้นบรรทัดใหม่ที่ตามหลังนั้นจะถูกลบออกจากคำสั่งทั้งหมดดังนั้นหากคุณวางไว้ในตำแหน่งที่ต้องการพื้นที่ว่าง (เช่นระหว่างพารามิเตอร์) เพื่อรวมช่องว่างด้วย (ทั้งก่อนหน้า^หรือที่จุดเริ่มต้นของบรรทัดถัดไป - ตัวเลือกหลังอาจช่วยให้ชัดเจนยิ่งขึ้นว่ามันเป็นความต่อเนื่อง)

ตัวอย่าง: (ทดสอบทั้งหมดใน Windows XP และ Windows 7)

xcopy file1.txt file2.txt

สามารถเขียนเป็น:

xcopy^
 file1.txt^
 file2.txt

หรือ

xcopy ^
file1.txt ^
file2.txt

หรือแม้กระทั่ง

xc^
opy ^
file1.txt ^
file2.txt

(นั่นเป็นงานสุดท้ายเพราะไม่มีช่องว่างระหว่างxcและและ^และไม่มีช่องว่างที่จุดเริ่มต้นของบรรทัดถัดไปดังนั้นเมื่อคุณลบ^และขึ้นบรรทัดใหม่คุณจะได้รับ ... xcopy.)

เพื่อความสามารถในการอ่านและการมีสติมันอาจเป็นการดีที่สุดระหว่างพารามิเตอร์เท่านั้น (โปรดรวมช่องว่าง)

ตรวจสอบให้แน่ใจว่า^เป็นไม่ได้เป็นสิ่งสุดท้ายในไฟล์ชุดที่มีที่ดูเหมือนจะเป็นปัญหาใหญ่กับที่


18

คำสั่งหลายคำสั่งสามารถใส่ไว้ในวงเล็บและแผ่กระจายไปทั่วหลายบรรทัด ดังนั้นสิ่งที่ชอบecho hi && echo helloสามารถใส่ดังนี้:

( echo hi
  echo hello )

ตัวแปรสามารถช่วย:

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

นอกจากนี้ฉันยังสังเกตเห็นด้วยคาเร็ต ( ^) ว่าifเงื่อนไขชอบให้พวกเขาทำตามเฉพาะเมื่อมีพื้นที่ว่าง:

if exist ^

1
บรรทัดcmd1.bat && cmd2.batจะแตกต่างจากรูปแบบ parens: execute cmd2.batiff cmd1.batดำเนินการสำเร็จ (โดยไม่ต้องมีการตั้งค่า%errorcode%) แบบฟอร์มหลังรันโดยไม่มีเงื่อนไข ค่อนข้างคาดไม่ถึง (อย่างน้อยสำหรับฉัน) ก็คือแน่นอนคุณไม่สามารถใช้การรวมกันของ + ทั้งสองอย่างเช่นบวก&&ก่อนการขึ้นบรรทัดใหม่
Paul Michalik

( echo <line break here> hello )ผลลัพธ์ในบรรทัดว่าง
Karl Morrison

คำตอบที่ดีที่สุดและสะอาดที่สุด! carets น่าเกลียดและเป็นปัญหาใน regex
neoscribe

9

อย่างไรก็ตามดูเหมือนว่าการแยกที่อยู่ตรงกลางของค่า for for loop นั้นไม่จำเป็นต้องมีเครื่องหมายรูปหมวก (และที่จริงแล้วการพยายามใช้อันใดอันหนึ่งจะถือเป็นข้อผิดพลาดทางไวยากรณ์) ตัวอย่างเช่น,

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

โปรดทราบว่าไม่จำเป็นต้องใช้พื้นที่แม้แต่หลังจากสวัสดีหรือก่อนลาก่อน


แน่นอนว่านี่เป็นส่วนหนึ่งของforไวยากรณ์: ตัวคั่นขององค์ประกอบใน "for-set" คือช่องว่างเครื่องหมายจุลภาคเครื่องหมายอัฒภาคเครื่องหมายเท่ากับเครื่องหมาย TAB และบรรทัดใหม่
Aacini

แต่ถ้าdoส่วนประกอบด้วยif-elseคำสั่งหลาย / ซ้อนกัน?
Vicky Dev

จากนั้นคุณสามารถใช้วงเล็บเพื่อใส่คำสั่งเช่น% n ใน (สวัสดีลาก่อน) ทำ (echo% n echo% n)
Mohammed Safwat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.