มีหลายวิธีในการดำเนินการคำสั่งที่แตกต่างกันbash
และcmd
ด้วยสคริปต์เดียวกัน
cmd
จะไม่สนใจบรรทัดที่ขึ้นต้นด้วย:;
ดังที่กล่าวไว้ในคำตอบอื่น ๆ นอกจากนี้ยังจะละเว้นบรรทัดถัดไปถ้าบรรทัดปัจจุบันจบลงด้วยคำสั่งrem ^
เป็นตัวละครที่จะหลบหนีแบ่งบรรทัดและบรรทัดถัดไปจะถือว่าเป็นความคิดเห็นโดย^
rem
สำหรับการbash
ละเว้นcmd
บรรทัดมีหลายวิธี ฉันได้แจกแจงวิธีการบางอย่างโดยไม่ทำลาย cmd
คำสั่ง:
#
คำสั่งที่ไม่มีอยู่จริง(ไม่แนะนำ)
หากไม่มี#
คำสั่งในcmd
ขณะรันสคริปต์เราสามารถทำได้:
echo 'Hello bash!'
#
ตัวอักษรที่จุดเริ่มต้นของcmd
สายทำให้bash
การรักษาว่าเส้นเป็นความคิดเห็น
#
ตัวละครในตอนท้ายของbash
สายจะใช้ในการแสดงความคิดเห็นออก\r
อักขระ, ไบรอัน Tompsett ชี้ให้เห็นในคำตอบของเขา หากไม่มีสิ่งนี้bash
จะทำให้เกิดข้อผิดพลาดหากไฟล์มีการ\r\n
สิ้นสุดบรรทัดตามที่cmd
กำหนด
ด้วยการทำเช่น# 2>nul
นี้เรากำลังหลอกล่อcmd
ให้ละเว้นข้อผิดพลาดของ#
คำสั่งที่ไม่มีอยู่จริงในขณะที่ยังคงเรียกใช้คำสั่งที่ตามมา
อย่าใช้วิธีนี้ถ้ามี#
คำสั่งที่มีอยู่บนหรือถ้าคุณไม่มีการควบคุมเกินคำสั่งที่สามารถใช้ได้PATH
cmd
ใช้echo
เพื่อละเว้น#
อักขระบนcmd
เราสามารถใช้echo
กับเอาต์พุตที่เปลี่ยนเส้นทางเพื่อแทรกcmd
คำสั่งในbash
พื้นที่ที่แสดงความคิดเห็น:
echo >/dev/null
echo 'Hello bash!'
ตั้งแต่#
ตัวละครที่ไม่มีความหมายพิเศษในการจะถือว่าเป็นส่วนหนึ่งของข้อความไปยังcmd
echo
สิ่งที่เราต้องทำคือเปลี่ยนทิศทางผลลัพธ์ของecho
คำสั่งและแทรกคำสั่งอื่น ๆ หลังจากนั้น
#.bat
ไฟล์ว่างเปล่า
echo >/dev/null
echo 'Hello bash!'
echo >/dev/null # 1>nul 2> #.bat
บรรทัดสร้างที่ว่างเปล่า#.bat
ไฟล์ในขณะที่cmd
(หรือแทนที่ที่มีอยู่#.bat
ถ้ามี) bash
และไม่ทำอะไรเลยในขณะที่
ไฟล์นี้จะถูกใช้โดยcmd
บรรทัดที่ตามหลังแม้ว่าจะมี#
คำสั่งอื่นในไฟล์PATH
.
del #.bat
คำสั่งในcmd
รหัส -specific ลบไฟล์ที่ถูกสร้างขึ้น คุณต้องทำสิ่งนี้ในcmd
บรรทัดสุดท้ายเท่านั้น
อย่าใช้วิธีนี้หาก#.bat
ไฟล์อาจอยู่ในไดเร็กทอรีการทำงานปัจจุบันของคุณเนื่องจากไฟล์นั้นจะถูกลบ
แนะนำ: การใช้เอกสารที่นี่เพื่อละเว้นcmd
คำสั่งบนbash
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
โดยการวาง^
ตัวละครในตอนท้ายของcmd
เส้นที่เรากำลังหลบหนีแบ่งบรรทัดและโดยใช้เป็นตัวคั่นที่นี่เอกสารเนื้อหาเส้นคั่นจะไม่มีผลกระทบต่อ:
cmd
วิธีการที่cmd
จะดำเนินการสายหลังจากที่สายเป็นมากกว่าการมีพฤติกรรมเช่นเดียวกับ:
bash
หากคุณต้องการมีหลายบรรทัดบนทั้งสองแพลตฟอร์มและดำเนินการเฉพาะที่ส่วนท้ายของบล็อกคุณสามารถทำได้:
:;(
:; echo 'Hello'
:; echo 'bash!'
:; );<<'here-document delimiter'
(
echo Hello
echo cmd!
) & rem ^
here-document delimiter
ตราบเท่าที่ไม่มีcmd
บรรทัดที่แน่นอนhere-document delimiter
โซลูชันนี้ควรใช้งานได้ คุณสามารถเปลี่ยนhere-document delimiter
เป็นข้อความอื่นได้
ในโซลูชันที่นำเสนอทั้งหมดคำสั่งจะถูกดำเนินการหลังจากบรรทัดสุดท้ายเท่านั้นทำให้พฤติกรรมสอดคล้องกันหากทำสิ่งเดียวกันบนทั้งสองแพลตฟอร์ม
การแก้ปัญหาเหล่านั้นต้องถูกบันทึกไว้ในไฟล์ที่มีเป็นตัวแบ่งบรรทัดมิฉะนั้นพวกเขาจะไม่ทำงานใน\r\n
cmd