การรันคำสั่งไฟล์แบตช์ Windows แบบอะซิงโครนัส


187

พูดถ้าฉันมี

  • foo.exe
  • bar.exe
  • baz.exe

ฉันจะเรียกใช้ทั้งหมดจากแฟ้มแบตช์แบบอะซิงโครนัสได้อย่างไรโดยไม่ต้องรอให้โปรแกรมก่อนหน้าหยุดทำงาน

คำตอบ:


254

การใช้STARTคำสั่งเพื่อรันแต่ละโปรแกรมควรจะได้รับสิ่งที่คุณต้องการ:

START "title" [/D path] [options] "command" [parameters]

การSTARTเรียกใช้ทุกครั้งจะรันคำสั่งที่กำหนดในพารามิเตอร์และส่งคืนทันทียกเว้นว่ามีการดำเนินการด้วย/WAITสวิตช์

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


โอเคขอบคุณ. ฉันควรอ่านแต่ละรายการhelpอย่างระมัดระวัง :)
RichN

8
วันก่อนฉันมีปัญหา ฉันต้องเปิดตัว 30 explorer windows เพื่อทดสอบประสิทธิภาพ ใช้งานไม่ได้และมันก็ไม่สำคัญพอที่ฉันจะมองมัน .. เริ่มต้นดูรอบ ๆ แทนในหน้าต่างนั้นและหลายชั่วโมงต่อมาเมื่อฉันปิดมันอีกอันหนึ่งโผล่ขึ้นมา! และฉันก็เหมือนสิ่งที่นรกปิดลง .. อีกอันหนึ่งก็โผล่ขึ้นมา! หลังจาก 4-5 windows และสิ่งที่ **** มากมายฉันสังเกตว่า batchfile ยังคงทำงานอยู่!
Jonas B

3
การโฆษณาด้วยตนเองที่ไร้ยางอาย: ฉันเคยสร้างแบตช์ที่สามารถทำงานได้เหมือนกับกลุ่มเธรดบางประเภทสำหรับกระบวนการ: stackoverflow.com/questions/672719/…
2552 Joey

4
หากคุณต้องการระบุอาร์กิวเมนต์หรือหากพา ธ ไปยังคำสั่งมีช่องว่างอย่าลืมเพิ่มเครื่องหมายคำพูด ในกรณีนี้คุณต้องระบุหัวเรื่องสำหรับหน้าต่างคอนโซลการเปิด: start "" "[path to command]" [command args]
Pierluigi

มีวิธีใดบ้างที่จะบอกเทคนิคนี้เมื่อเสร็จสิ้น? ฉันเริ่มทำสำเนาไฟล์ FILA DESTA ~ 30 และฉันอยากให้มันเป็นแบบซิงค์ แต่ฉันก็อยากจะมีความคิดเมื่อพวกเขาทำเสร็จแล้ว
Doug

68

คุณสามารถลองรวมคำตอบก่อนหน้าสองสามข้อเข้าstart /b cmd /c foo.exeด้วยกัน

สำหรับตัวอย่างเล็ก ๆ น้อย ๆ หากคุณต้องการพิมพ์รุ่นของ java / groovy / grails / gradle คุณสามารถทำได้ในไฟล์แบทช์:

@start /b cmd /c java -version
@start /b cmd /c gradle -version
@start /b cmd /c groovy -version
@start /b cmd /c grails -version

หากคุณมีบางอย่างเช่น Process Explorer (Sysinternals) คุณจะเห็นเด็กสองสามคนประมวลผล cmd.exe แต่ละกระบวนการด้วยกระบวนการ java (ตามคำสั่งข้างต้น) ผลลัพธ์จะพิมพ์ไปที่หน้าจอตามลำดับที่พวกเขาจะเสร็จสิ้น

start /b :  Start application without creating a new window. The
             application has ^C handling ignored. Unless the application
             enables ^C processing, ^Break is the only way to interrupt
             the application

cmd /c : Carries out the command specified by string and then terminates

13
มันป้องกันไม่ให้คำสั่งถูกสะท้อนไปยังคอนโซล ในสคริปต์แบทช์บางครั้งคุณจะเห็นecho offจุดเริ่มต้นซึ่งเมื่อคุณรันสคริปต์จะป้องกันไม่ให้คำสั่งทั้งหมดถูกสะท้อนไปยังคอนโซล @คล้ายกัน แต่เพียงว่าคำสั่งเดียว @echo offดังนั้นบางครั้งคุณจะเห็น
djKianoosh

36

คุณสามารถใช้คำสั่งเริ่มต้นเพื่อวางไข่กระบวนการพื้นหลังโดยไม่ต้องเปิดหน้าต่างใหม่:

start /b foo.exe

กระบวนการใหม่จะไม่ถูกขัดจังหวะด้วย CTRL-C; คุณสามารถฆ่ามันได้ด้วย CTRL-BREAK เท่านั้น (หรือโดยการปิดหน้าต่างหรือผ่านตัวจัดการงาน)


5
BREAKวันนี้คีย์บอร์ดอยู่ที่ไหน
user2023370

1
@ user2023370 ยังคงอยู่บนปุ่มหยุดชั่วคราว แล็ปท็อปส่วนใหญ่ที่ขาดคีย์บางสนับสนุนซ่อนคีย์ผสม
Gerold Broser


23

สร้างแบตช์ไฟล์ด้วยบรรทัดต่อไปนี้:

start foo.exe
start bar.exe
start baz.exe 

คำสั่งเริ่มต้นทำงานคำสั่งของคุณในหน้าต่างใหม่เพื่อให้ทั้ง 3 คำสั่งที่จะทำงานแบบไม่พร้อมกัน


17

ใช้คำสั่ง START :

start [programPath]

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

start "[title]" "[program path]"

หากคุณจำเป็นต้องระบุอาร์กิวเมนต์ต่อท้ายพวกเขา (นอกเครื่องหมายคำสั่ง)

start "[title]" "[program path]" [list of command args]

ใช้ตัวเลือก / b เพื่อหลีกเลี่ยงการเปิดหน้าต่างคอนโซลใหม่ (แต่ในกรณีนั้นคุณไม่สามารถขัดจังหวะแอปพลิเคชันโดยใช้ CTRL-C


10

มีตัวเลือกที่สาม (และอาจง่ายกว่ามาก) หากคุณต้องการหมุนหลายอินสแตนซ์ของโปรแกรมเดียวการใช้ตัวประมวลผลคำสั่ง Unix แบบ Xargs หรือ GNU Parallel สามารถทำให้กระบวนการนั้นค่อนข้างตรงไปตรงมา

มี win32 Xargs clone ที่ชื่อว่าPPX2ซึ่งทำให้ตรงไปตรงมา

ตัวอย่างเช่นหากคุณต้องการแปลงรหัสของไฟล์วิดีโอคุณสามารถเรียกใช้คำสั่ง:

dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"

การเลือกสิ่งนี้แยกdir /b *.mpgรายการของไฟล์. mpg ในไดเรกทอรีปัจจุบันของฉันผู้|ดำเนินการไพพ์รายการนี้เป็น ppx2 ซึ่งจะสร้างชุดคำสั่งที่จะดำเนินการแบบขนาน 4 ต่อครั้งตามที่ระบุไว้ที่นี่โดย-P 4ผู้ประกอบการ -L 1ผู้ประกอบการบอก ppx2 เพียงส่งหนึ่งบรรทัดของไดเรกทอรีของเรารายชื่อเพื่อ ffmpeg ในเวลา

หลังจากนั้นคุณเพียงแค่เขียนบรรทัดคำสั่ง ( ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4") ของคุณและ{}จะถูกแทนที่โดยอัตโนมัติสำหรับแต่ละบรรทัดของรายการไดเรกทอรีของคุณ

ไม่สามารถใช้ได้กับทุกกรณี แต่จะง่ายกว่าการใช้ชุดการแก้ไขแฟ้มรายละเอียดด้านบน แน่นอนถ้าคุณไม่ได้จัดการกับรายการไฟล์คุณสามารถไปที่เนื้อหาของ textfile หรือโปรแกรมอื่น ๆ ในอินพุตของ pxx2


1
xargs win32 พอร์ตล่าสุดใช้งานได้ดีในปัจจุบัน (อันที่มาพร้อมกับ git สำหรับ windows อยู่แล้ว)
Peter M

สิ่งนี้ดีมากยกเว้นว่าจะจัดการไฟล์ที่มีอักขระยูนิโค้ดไม่สำเร็จ มีแผนที่จะรองรับไฟล์ unicode หรือไม่? ขอบคุณ
Gökhan Sever

@ GökhanSeverในอดีตที่ผ่านมาฉันได้แก้ไขปัญหานี้โดยใช้รูปแบบ "ชื่อย่อ" ของเส้นทางที่ดูเหมือน C: \ PROGRA ~ 1 \ WINDOW ~ 3 \ MYPROG ~ 1.EXE ไม่สวย แต่ใช้งานได้
หลอมเหลว

-1

ฉันไม่สามารถทำงานอะไรได้ฉันลงเอยด้วยการใช้ powershell เพื่อเริ่มสคริปต์ bat .. บางครั้งก็เริ่ม cmd / c ไม่แน่ใจว่าทำไม .. ฉันยังลองสิ่งต่างๆเช่น start cmd / c notepad & exit

start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.