ทำไมบรรทัดแรกของไฟล์แบตช์ Windows นี้ทำงาน แต่ทั้งสามบรรทัดดำเนินการในเชลล์คำสั่ง


171

ฉันมีไฟล์แบตช์ที่รันคำสั่ง Maven สามคำสั่งหนึ่งคำสั่งหลังจากนั้น แต่ละคำสั่งสามารถดำเนินการได้สำเร็จในสคริปต์ - ด้วยตัวเอง! แต่เมื่อฉันเพิ่มทั้งสามคำสั่งลงในไฟล์เดียวกันเฉพาะคำสั่งแรกเท่านั้นที่รันก่อนที่สคริปต์จะออก มีความคิดอะไรไหม

mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true

นอกจากนี้หากฉันคัดลอกทั้งสามคำสั่งและวางลงในเชลล์คำสั่ง (cmd.exe) พวกเขาจะดำเนินการทีละคำสั่งโดยไม่มีปัญหา ดังนั้นนี่คือปัญหาบางอย่างกับไฟล์แบทช์ดอส


2
ช่างเป็นอะไร: ฉันมาที่นี่พร้อมกับปัญหาเดียวกันและคำสั่งเดียวกันในไฟล์แบทช์ของฉัน - หลายบรรทัดของ "mvn ติดตั้ง: ติดตั้งไฟล์" :-D
fishbone


1
@fishbone และคุณและ OP โดยบังเอิญต่างก็มีชื่อเสียง 1.3k ..
p_champ

คำตอบ:


297

Maven ใช้แบตช์ไฟล์เพื่อทำธุรกิจ ด้วยสคริปต์ชุดงานคุณต้องเรียกใช้สคริปต์อื่นโดยใช้callคำสั่งเพื่อให้รู้ว่าจะกลับไปที่สคริปต์ของคุณหลังจากสคริปต์ที่เรียกเสร็จสมบูรณ์ ลองเพิ่มcallคำสั่งทั้งหมด

อีกสิ่งที่คุณลองได้คือใช้startคำสั่งที่ควรจะทำงานในทำนองเดียวกัน


1
ฉันได้ใส่antในชุดของไฟล์ windows ก่อนและcallจำเป็นต้องได้รับantการดำเนินการ หากไม่มีcallแบทช์จะหยุดทำงานหลังจากคำสั่งแรกดังนั้นสองรายการที่สองจะไม่ทำงาน microsoft.com/resources/documentation/windows/xp/all/proddocs/…สำหรับข้อมูลเพิ่มเติมเกี่ยวกับcall
โอเว่น

22
startจะทำให้หน้าต่างใหม่วางไข่และคำสั่งทั้งสามคำสั่งจะทำงานแบบขนาน callหากคุณต้องการพวกเขาให้ทำงานพร้อมกันใช้
akf

11
ในโลกมันเหมาะสมกับสภาพแวดล้อมของสคริปต์ที่จะทำตัวแบบนี้ได้อย่างไร? หากฉันเขียนสคริปต์ด้วยสองคำสั่งฉันคาดว่าคำสั่งจะถูกดำเนินการ ฉันไม่ได้คาดหวังว่าสภาพแวดล้อมจะตัดสินใจหยุดดำเนินการสคริปต์เพียงเพราะคำสั่งอย่างใดอย่างหนึ่งเหล่านี้เกิดขึ้นเพื่อนำไปใช้เป็นสคริปต์
bames53

3
@ bames53: นี่เป็นข้อ จำกัด ที่มาจาก DOS ที่นำไปสู่การใช้งานที่ทันสมัยของพรอมต์คำสั่งใน Windows เนื่องจากเป้าหมายของ Microsoft คือการรักษาความเข้ากันได้ย้อนหลังนี่คือผลลัพธ์
Jeff Mercado

2
เพิ่มcall pauseในตอนท้าย (โดยไม่ใส่เครื่องหมายอัญประกาศ) หากคุณต้องการเปิดหน้าต่าง cmd ไว้
JinSnow

28

มีความcallช่วยเหลือ อย่างไรก็ตามวันนี้มันไม่ได้

นี่คือวิธีที่ฉันแก้ไขมัน:

เนื้อหาไฟล์ Bat (หากคุณต้องการหยุดแบตช์เมื่อเกิดข้อผิดพลาด cmds ข้อใดข้อหนึ่ง)

cmd1 && ^
cmd2 && ^
cmd3 && ^
cmd4

เนื้อหาไฟล์ Bat (ถ้าคุณต้องการแบตช์ต่อเมื่อเกิดข้อผิดพลาด cmds อย่างใดอย่างหนึ่ง)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4

(ตัวอย่างแรกที่นี่เทียบเท่ากับcmd1 && cmd2 && cmd3 && cmd4หลักการทำคำสั่งทั้งหมดหนึ่งบรรทัด.)
เบน Gotow

2
จริง ฉันเขียนมันอย่างนั้นเพราะเป็นไฟล์ bat ส่วนใหญ่คุณจะมีหลายคำสั่งยาวอาจ 4 คำสั่งในบรรทัดจะไม่ดีในการบำรุงรักษาในอนาคต ความสามารถในการอ่านเป็นกุญแจสำคัญในการเขียนโปรแกรมที่ดีและดังนั้นจึงอยู่ในบรรทัดที่แตกต่างกัน
Manohar Reddy Poreddy

1
วิธีนี้แก้ปัญหาให้ฉันได้ callวิธีการแก้ปัญหาไม่ได้หยุดที่ข้อผิดพลาดอันนี้ทำ
ทิม

9

ในการรัน Maven บิวด์จากสคริปต์ตัวเดียวคุณจะต้องใช้ฟังก์ชั่นการโทรของ Windows ด้วยวิธีต่อไปนี้:

call mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true

1

มันควรจะเป็นที่mvnคำสั่งเฉพาะexecและไม่กลับมาจึงไม่ดำเนินการส่วนที่เหลือของคำสั่ง


มีวิธีบังคับให้สคริปต์เรียกใช้mvnคำสั่งถัดไปหรือไม่
วิกิ

1

ลองเขียนไฟล์แบตช์ต่อไปนี้และดำเนินการมัน

Echo one
cmd
Echo two
cmd
Echo three
cmd

เฉพาะสองบรรทัดแรกเท่านั้นที่ถูกเรียกใช้งาน แต่ถ้าคุณพิมพ์ "exit" ที่พรอมต์คำสั่งสองบรรทัดถัดไปจะถูกประมวลผล มันเป็นเชลล์ที่โหลดอีกอัน

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

HTH!


ไม่น่า; Maven callแน่นอนใช้ไฟล์ชุดซึ่งเป็นเหตุผลที่พวกเขาจำเป็นต้องใช้ ไม่ใช่เปลือกที่ซ้อนกันซึ่งไม่ได้ยกเลิก
Joey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.