มีหลายวิธีในการเรียกไฟล์แบตช์ windows จากไฟล์อื่นหรือจากพร้อมต์ อันไหนในกรณีนี้?


92

ไฟล์แบตช์ windows ( called.batหรือcalled.cmd) สามารถเรียกได้จากไฟล์แบตช์อื่น ( caller.batหรือcaller.cmd) หรือพร้อมต์ cmd.exe แบบโต้ตอบได้หลายวิธี:

  1. โทรโดยตรง: called.bat
  2. ใช้คำสั่งโทร: call called.bat
  3. ใช้คำสั่ง cmd: cmd /c called.bat
  4. ใช้คำสั่ง start: start called.bat

ฉันค่อนข้างมีปัญหาในการแยกความแตกต่างของการใช้งานที่ตั้งใจไว้ตามข้อความช่วยเหลือ: ควรใช้เมื่อใด เช่นทำไมฉันถึงใช้คำสั่ง 'โทร' แทนการโทรโดยตรง ต่างกันอย่างไร

ฉันสนใจรายงานสรุปที่วิเคราะห์ความเป็นไปได้ทั้ง 4 ข้อ (และอื่น ๆ หากขาดหายไป) จากมุมมองต่างๆ: กรณีการใช้งานที่แนะนำซึ่งออกแบบมาให้เหมาะสมการวางไข่ของกระบวนการบริบทการดำเนินการสภาพแวดล้อมการประมวลผลโค้ดส่งคืน

หมายเหตุ: ฉันใช้ Windows XP SP3

คำตอบ:


101
  1. ไฟล์แบตช์จะดำเนินการโดยอินสแตนซ์ cmd.exe ปัจจุบัน (หรืออินสแตนซ์ cmd.exe ใหม่เช่นถ้าดับเบิลคลิกใน Explorer)

  2. เช่นเดียวกับ # 1 มีผลเฉพาะเมื่อใช้ภายในไฟล์ batch / cmd ในไฟล์แบตช์โดยไม่มี "การโทร" ไฟล์แบตช์พาเรนต์จะสิ้นสุดลงและการควบคุมจะส่งผ่านไปยังไฟล์แบตช์ที่เรียกว่า ด้วย 'call' เรียกใช้ไฟล์แบตช์ลูกและไฟล์แบตช์พาเรนต์จะดำเนินต่อไปพร้อมกับคำสั่งหลังการเรียก

  3. รันไฟล์แบตช์ในอินสแตนซ์ cmd.exe ใหม่

  4. Start จะเรียกใช้ไฟล์แบตช์ในอินสแตนซ์ cmd.exe ใหม่ในหน้าต่างใหม่และผู้โทรจะไม่รอให้เสร็จสิ้น


7
หมายเหตุสำหรับตัวเลือก 4 คำสั่ง start ควรตามด้วย 'title'เสมอดังนั้นหากคุณไม่ต้องการชื่อคุณควรมีเครื่องหมายคำพูดคู่ว่างเปล่าเช่นstart "" [options] command
Daryn

@Daryn ลิงก์นั้นระบุว่าคุณควรมีเสมอ แต่ยังบอกว่า Microsoft อธิบายพารามิเตอร์เป็นทางเลือก พวกเขาไม่ได้บอกฉันว่าทำไมจึงควร "จำเป็น" แม้แต่ตัวอย่างหลาย ๆ ตัวอย่างที่ด้านล่างก็ยังละเว้นพารามิเตอร์ title
Adam Plocher

5

สิ่งหนึ่งที่ไม่ชัดเจนจากความคิดเห็นที่นี่: เมื่อคุณเรียกไฟล์แบตช์หนึ่งไฟล์จากอีกไฟล์หนึ่งโดยใช้แค่ชื่อ (กรณี # 1 ในคำถามดั้งเดิม) การดำเนินการจะหยุดจากไฟล์แบตช์การเรียก ตัวอย่างเช่นในบรรทัดเหล่านี้:

called.bat
echo Hello

บรรทัด 'echo Hello' (และอะไรก็ตามที่ตามมา) จะไม่ถูกเรียก หากคุณใช้คีย์เวิร์ด 'โทร' การดำเนินการจะดำเนินต่อหลังจากการโทร ดังนั้นในกรณีนี้:

call called.bat
echo Hello

จะมีการเรียกบรรทัด "echo Hello"

นอกจากนี้ตัวแปรทั้งหมดที่ตั้งค่าในไฟล์ called.bat จะถูกส่งกลับไปที่กระบวนการเรียกด้วยเช่นกัน

ลองนึกภาพไฟล์ 'called.bat' ที่มีบรรทัดนี้:

set MYVAR=hello

จากนั้น% MYVAR% จะพร้อมใช้งานสำหรับไฟล์แบตช์การโทรหากใช้:

call called.bat

แต่มันจะไม่ใช้

REM starts a new cmd.exe process
start called.bat   

REM stops and replaces current cmd.exe process with a new one
called.bat        
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.