มี Windows CMD เทียบเท่ากับ exec ของเชลล์ Unix หรือไม่


9

มี Windows เทียบเท่ากับ "exec" ของ Unix Shell หรือไม่? โดยทั่วไปฉันจำเป็นต้องหลีกเลี่ยงการฟอร์กกระบวนการใหม่เพื่อให้ท่ออินพุต / เอาท์พุตได้รับการเก็บรักษาไว้เช่นเดียวกับ id กระบวนการ

แก้ไข:

นี่คือปัญหาของฉัน ฉันมีกระบวนการ A ที่เริ่มต้นสคริปต์และสคริปต์นี้จบลงด้วยการดำเนินการตามกระบวนการ B ฉันต้องการให้ A เพื่อให้ได้ผลลัพธ์ทั้งหมดของ B รวมถึงสามารถฆ่า B โดยการฆ่ากระบวนการที่เกิดขึ้น (สคริปต์) .

บน Unix การดำเนินการ B ด้วยexecทำงานดังกล่าว


อย่างน้อยก็ไม่ได้ใช้คำสั่งและโปรแกรมมาตรฐานของ Windows
John Gardeniers

หากคุณกำลังพยายามเรียกใช้ไฟล์ปฏิบัติการมากกว่าแฟ้มแบตช์อื่นแสดงว่าไม่มีวิธี (สนับสนุน / สมจริง) ในการทำเช่นนี้ อย่างไรก็ตามโดยปกติแล้วไพพ์อินพุต / เอาท์พุตจะได้รับการสืบทอดโดยแอปพลิเคชันที่ทำงานในแบตช์ หากคุณสามารถอธิบายได้ว่าทำไมคุณถึงต้องการทำสิ่งนี้เราอาจแนะนำทางเลือกอื่น ๆ
Harry Johnston

กระบวนการ A ควรได้รับผลลัพธ์ทั้งหมดของ B อยู่แล้วยกเว้นว่าสคริปต์จะแทนที่สิ่งนี้ สิ่งนี้ไม่ทำงานใช่ไหม
แฮร์รี่จอห์นสตัน

มีความเป็นไปได้ที่จะใช้ Win32 API เพื่อจัดการกระบวนการลูกให้ตายเมื่อกระบวนการหลักทำอย่างไรก็ตามไม่มีตัวเลือกบรรทัดคำสั่ง AFAIK ในตัว ถ้าฉันให้ซอร์สโค้ด (สำหรับ Visual C ++) คุณสามารถสร้างมันได้หรือไม่?
แฮร์รี่จอห์นสตัน

@Harry ฉันฟอร์กสคริปต์จาก Java ดังนั้นหากความคิดสำหรับกระบวนการ A เพื่อใช้ Win32 API นั้นฉันกลัวว่ามันไม่น่าจะทำงานได้ แต่ฉันขอบคุณสำหรับความพยายาม ดีกว่าที่จะอธิบายมันเป็นไปไม่ได้และฉันจะยอมรับว่าเป็นคำตอบ
Daniel C. Sobral

คำตอบ:


7

AFAIK ไม่มี Windows ขาดexecv()ซึ่ง bash exec ทำ callใช้งานได้สำหรับการเรียกไฟล์แบตช์ (ง่ายเพียงแปลไฟล์ในล่ามปัจจุบันคล้ายกับ.คำสั่งของ bash ) แต่ไม่ใช่สำหรับ exes

สิ่งนี้ทำให้เป็นไปไม่ได้ที่จะเขียนสคริปต์ wrapper แบบหนึ่งบรรทัดสำหรับสคริปต์ในภาษาใด ๆ บน Windows คุณจะได้รับ "ยุติงานแบ็ตช์เสมอ" crap บน Ctrl + C และฆ่ากระบวนการแบทช์ (ไม่ใช่ Ctrl + C จากตัวจัดการงานพูด) จะไม่ฆ่ากระบวนการลูก ตอนนี้ฉันกำลังมองหาไฟล์เทมเพลต C เพื่อตัดคำนี้

UPDATE: Windows มี_execv()อยู่ในเลเยอร์ความเข้ากันได้ POSIX ใน MSVCRT แต่ AFAIK (ยังไม่ได้ทดสอบ) มันเป็นเพียงตัวห่อหุ้มรอบ ๆCreateProcessดังนั้นมันจะสร้างกระบวนการใหม่เสมอมันไม่สามารถแทนที่กระบวนการปัจจุบันได้


2

ฉันคิดว่าการโทรเป็นสิ่งที่คุณต้องการ แต่ฉันไม่แน่ใจ 100%


4
หากคุณต้องการเรียกใช้ไฟล์แบตช์หนึ่งจากอีกไฟล์หนึ่งโดยไม่ต้องเปิดใช้งานอินสแตนซ์ใหม่ของ cmd.exe การโทรคือคำตอบที่ถูกต้อง
แฮร์รี่จอห์นสตัน

1

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

SET yourDynamicCommand=SET var=1
%yourDynamicCommand%
ECHO var's value is %var%

สิ่งนี้ไม่ได้ทำอะไรเช่นexec...
Jakuje

-1
  • ดำเนินการแบทช์ไฟล์ :call
  • เรียกใช้งานexe-files : ไม่จำเป็นต้องใช้คำสั่งให้โทรหาโดยตรง/path/to/exe/something.exe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.