มีหลายวิธีในการดำเนินการคำสั่งที่แตกต่างกันbashและcmdด้วยสคริปต์เดียวกัน
cmdจะไม่สนใจบรรทัดที่ขึ้นต้นด้วย:;ดังที่กล่าวไว้ในคำตอบอื่น ๆ นอกจากนี้ยังจะละเว้นบรรทัดถัดไปถ้าบรรทัดปัจจุบันจบลงด้วยคำสั่งrem ^เป็นตัวละครที่จะหลบหนีแบ่งบรรทัดและบรรทัดถัดไปจะถือว่าเป็นความคิดเห็นโดย^rem
สำหรับการbashละเว้นcmdบรรทัดมีหลายวิธี ฉันได้แจกแจงวิธีการบางอย่างโดยไม่ทำลาย cmdคำสั่ง:
#คำสั่งที่ไม่มีอยู่จริง(ไม่แนะนำ)
หากไม่มี#คำสั่งในcmdขณะรันสคริปต์เราสามารถทำได้:
echo 'Hello bash!'
#ตัวอักษรที่จุดเริ่มต้นของcmdสายทำให้bashการรักษาว่าเส้นเป็นความคิดเห็น
#ตัวละครในตอนท้ายของbashสายจะใช้ในการแสดงความคิดเห็นออก\rอักขระ, ไบรอัน Tompsett ชี้ให้เห็นในคำตอบของเขา หากไม่มีสิ่งนี้bashจะทำให้เกิดข้อผิดพลาดหากไฟล์มีการ\r\nสิ้นสุดบรรทัดตามที่cmdกำหนด
ด้วยการทำเช่น# 2>nulนี้เรากำลังหลอกล่อcmdให้ละเว้นข้อผิดพลาดของ#คำสั่งที่ไม่มีอยู่จริงในขณะที่ยังคงเรียกใช้คำสั่งที่ตามมา
อย่าใช้วิธีนี้ถ้ามี#คำสั่งที่มีอยู่บนหรือถ้าคุณไม่มีการควบคุมเกินคำสั่งที่สามารถใช้ได้PATHcmd
ใช้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\ncmd