วิธีการเรียกใช้กระบวนการในพื้นหลังโดยไม่เปิดแบทช์ไฟล์ไว้?


9

ฉันมีบริการ Windows (เซิร์ฟเวอร์การรวม Bamboo) ที่รันไฟล์แบตช์เป็นงานย่อย (งานบิลด์) ของสคริปต์นั้น ภายในแบทช์ไฟล์นั้นฉันต้องการที่จะเริ่มกระบวนการ (เรียกมันว่า workerprocess.exe) และให้กระบวนการนั้นทำงานในพื้นหลัง ทั้งหมดนี้เป็นสิ่งที่ดีฉันใช้:

start "title" /B workerprocess.exe

นั่นคือทั้งหมดที่ดีและดี ปัญหาคือว่านี่ถือเสร็จงานสร้าง ดังนั้นสคริปต์แบทช์จึงเสร็จสิ้น แต่เนื่องจาก subprocess ของผู้ปฏิบัติงาน processprocess.exe บริการ (Bamboo) ไม่ทราบว่ามันเสร็จสิ้นแล้วมันยังคงรอ (และแสดงผลลัพธ์จาก)

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

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


1
คุณลองโดยไม่มีพารามิเตอร์ "/ B" เพื่อที่จะไม่เริ่มกระบวนการภายในหน้าต่างคำสั่งเดียวกันหรือไม่
Josh

@JoshR นั่นเปลี่ยนสิ่งต่าง ๆ บริการไม่ได้รับผลลัพธ์จากกระบวนการอีกต่อไป แต่ยังคงถูกบล็อกโดยบริการดังกล่าว
แจ็คสกอตต์

คำตอบ:


2

คุณลองHidden Start (HSTART) แล้วหรือยัง (ค่าใช้จ่าย $ 20)

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


เมื่อฉันเขียนคำตอบของฉันในเดือนกันยายน 2013 ผลิตภัณฑ์นั้นฟรีทั่ว น่าเศร้าที่พวกเขากำลังคิดราคา
อาทิตย์

3

สคริปต์ที่เชื่อมโยงทั้งหมดสามารถดาวน์โหลดและบันทึกด้วยชื่ออะไรก็ได้ที่คุณสะดวก

1) โซลูชันIEXPRESS - เนื่องจากอาร์กิวเมนต์ยอมรับเฉพาะคำสั่งและอาร์กิวเมนต์

ตัวอย่างการใช้งาน:

call hidder.bat myBat.bat  myexe.exe
call myexe.exe

2) SCHTASKS - ยอมรับเพียงสองข้อโต้แย้งอีกครั้ง - คำสั่งและข้อโต้แย้งนอกจากนี้ยังตรวจสอบว่ามันเริ่มต้นด้วยการยกระดับสิทธิ์และถ้าเป็นไปได้รับ PID ของกระบวนการด้วยคำสั่ง WEVTUTIL

ตัวอย่างการใช้งาน:

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"

3) 'WScript.Shell' - สคริปต์เป็น wrapper เต็มรูปแบบของ 'WScript.Shell' และทุกตัวเลือกที่เป็นไปได้สามารถตั้งค่าผ่านตัวเลือกบรรทัดคำสั่งมันเป็นไฮบริด jscript / แบทช์และสามารถเรียกว่าเป็นค้างคาว

ตัวอย่างการใช้งาน (สำหรับข้อมูลเพิ่มเติมพิมพ์ความช่วยเหลือด้วย '-h'):

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 

4) 'Win32_ProcessStartup' - wrapper เต็มอีกครั้งและตัวเลือกทั้งหมดสามารถเข้าถึงได้ผ่านอาร์กิวเมนต์บรรทัดคำสั่งเวลานี้เป็น WSF / ชุดผสมกับ Jscript และ VBScript บางส่วนของรหัส - แต่มันคืนค่า PID ของกระบวนการเริ่มต้นถ้ากระบวนการ id ไม่ได้ซ่อนตัวเลือกบางอย่างเช่นพิกัด X / Y สามารถใช้งานได้

ตัวอย่างการใช้งาน (สำหรับข้อมูลเพิ่มเติมพิมพ์ความช่วยเหลือด้วย '-h') สิ่งนี้จะต้องใช้พา ธ แบบเต็มไปยังไฟล์เรียกทำงาน / สคริปต์หากไม่ได้อยู่ใน%path%:

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindow 0 -title "notepad"

5) วิธีการแก้ปัญหา NET ProcessStartInfo ตัวเลือกส่วนใหญ่จะใช้ (แต่ท้ายที่สุดฉันก็เหนื่อยเกินกว่าจะรวมทุกอย่าง):

ตัวอย่างการใช้งาน (สำหรับข้อมูลเพิ่มเติมพิมพ์ความช่วยเหลือด้วย '-h'):

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal

ไม่พบลิงก์
Rahil Wazir

@rahilwazir - แก้ไขแล้ว
npocmaka

1
ฉันลองพวกนี้สักหน่อย - ฉันคิดว่ารายละเอียดต้องได้รับการจัดการที่ดี เพียงดูวิธีแรก: IExpress ลิงก์คือ hidder.bat ตัวอย่างด้านบนใช้อย่างอื่น เมื่อฉันรันสคริปต์มันไม่สามารถขอ EXE ให้ฉันซึ่งไม่ได้กล่าวถึงข้างต้น นั่นอาจจะใช้ได้ถ้ามี markdown บน github แต่ไม่มี สุดท้ายใช้มันผลิตไฟล์ .DDF บางส่วน แต่ไม่มีอะไรอื่น ....
JoeG
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.