ฉันจะแบ่งคำสั่งแบบยาวเป็นหลายบรรทัดในแบตช์ไฟล์ได้อย่างไร
ฉันจะแบ่งคำสั่งแบบยาวเป็นหลายบรรทัดในแบตช์ไฟล์ได้อย่างไร
คำตอบ:
คุณสามารถแยกบรรทัดยาวออกด้วยเครื่องหมายรูปหมวก^
ตราบเท่าที่คุณจำได้ว่าเครื่องหมายรูปหมวกและขึ้นบรรทัดใหม่หลังจากนั้นจะถูกลบออกอย่างสมบูรณ์ ดังนั้นหากควรมีช่องว่างที่คุณแบ่งเส้นรวมช่องว่าง ( เพิ่มเติมในด้านล่าง )
ตัวอย่าง:
copy file1.txt file2.txt
จะเขียนเป็น:
copy file1.txt^
file2.txt
echo
แก้ไข
co^␍py ^␍file1 ^␍file2
คุณสามารถแยกได้ทุกสายรวมทั้งในช่วงกลางของคำเช่น ฉันขอแนะนำให้คุณลบความคิดเห็นของคุณเพื่อหลีกเลี่ยงความสับสนโดยเฉพาะอย่างยิ่งการแสวงหานี้เป็นที่นิยมอย่างหนึ่ง
กฎสำหรับคาเร็ตคือ:
เครื่องหมายรูปหมวกที่ท้ายบรรทัดต่อท้ายบรรทัดถัดไปอักขระตัวแรกของบรรทัดต่อท้ายจะถูก 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
บรรทัดว่างมีความสำคัญต่อความสำเร็จ สิ่งนี้ใช้ได้เฉพาะกับการขยายที่ล่าช้ามิฉะนั้นส่วนที่เหลือของบรรทัดจะถูกข้ามหลังจากป้อนบรรทัด
ใช้งานได้เนื่องจากคาเร็ตที่ปลายบรรทัดละเว้นฟีดบรรทัดถัดไปและหนีอักขระถัดไปแม้ว่าอักขระถัดไปจะเป็นฟีดบรรทัด (การขึ้นบรรทัดใหม่จะถูกละเว้นในเฟสนี้เสมอ)
copy ^[newline]"file1.txt" ^[newline]"file2.txt"
ไม่ทำงาน! ฉันต้องเพิ่มช่องว่าง: copy ^[newline] "file1.txt" ^[newline] "file2.txt"
.
(นี่เป็นคำตอบที่เขียนซ้ำของ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
.)
เพื่อความสามารถในการอ่านและการมีสติมันอาจเป็นการดีที่สุดระหว่างพารามิเตอร์เท่านั้น (โปรดรวมช่องว่าง)
ตรวจสอบให้แน่ใจว่า^
เป็นไม่ได้เป็นสิ่งสุดท้ายในไฟล์ชุดที่มีที่ดูเหมือนจะเป็นปัญหาใหญ่กับที่
คำสั่งหลายคำสั่งสามารถใส่ไว้ในวงเล็บและแผ่กระจายไปทั่วหลายบรรทัด ดังนั้นสิ่งที่ชอบ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 ^
cmd1.bat && cmd2.bat
จะแตกต่างจากรูปแบบ parens: execute cmd2.bat
iff cmd1.bat
ดำเนินการสำเร็จ (โดยไม่ต้องมีการตั้งค่า%errorcode%
) แบบฟอร์มหลังรันโดยไม่มีเงื่อนไข ค่อนข้างคาดไม่ถึง (อย่างน้อยสำหรับฉัน) ก็คือแน่นอนคุณไม่สามารถใช้การรวมกันของ + ทั้งสองอย่างเช่นบวก&&
ก่อนการขึ้นบรรทัดใหม่
( echo <line break here> hello )
ผลลัพธ์ในบรรทัดว่าง
อย่างไรก็ตามดูเหมือนว่าการแยกที่อยู่ตรงกลางของค่า for for loop นั้นไม่จำเป็นต้องมีเครื่องหมายรูปหมวก (และที่จริงแล้วการพยายามใช้อันใดอันหนึ่งจะถือเป็นข้อผิดพลาดทางไวยากรณ์) ตัวอย่างเช่น,
for %n in (hello
bye) do echo %n
โปรดทราบว่าไม่จำเป็นต้องใช้พื้นที่แม้แต่หลังจากสวัสดีหรือก่อนลาก่อน
for
ไวยากรณ์: ตัวคั่นขององค์ประกอบใน "for-set" คือช่องว่างเครื่องหมายจุลภาคเครื่องหมายอัฒภาคเครื่องหมายเท่ากับเครื่องหมาย TAB และบรรทัดใหม่
do
ส่วนประกอบด้วยif-else
คำสั่งหลาย / ซ้อนกัน?
^
และหลังข้อความคำสั่งของคุณ