พรอมต์คำสั่งรู้ได้อย่างไรว่าต้องรอออกเมื่อใด


90

ฉันกำลังพยายามทำการรีโค้ดพรอมต์คำสั่งของ Windows ใน C # ฉันสงสัยว่าพรอมต์คำสั่งรู้ได้อย่างไรว่าต้องรอให้กระบวนการเริ่มออกเมื่อใดและเมื่อใดที่ไม่ควรรอให้กระบวนการที่เรียกว่าออก

ตัวอย่างเช่นหากคุณพิมพ์ "notepad" ในพรอมต์คำสั่งNotepadจะเปิดขึ้น แต่คุณยังสามารถเรียกใช้คำสั่งอื่นได้ อย่างไรก็ตามหากคุณเปิดยูทิลิตี้เช่น more.com, ping.exe หรือยูทิลิตี้อื่นโปรแกรมจะรอให้โปรแกรมเรียกใช้งานเสร็จสิ้นก่อนที่คุณจะดำเนินการคำสั่งอื่น

พรอมต์คำสั่งรู้ได้อย่างไรว่าต้องรอการออกเมื่อใดและจะจำลองพฤติกรรมนี้ใน C # ได้อย่างไร


13
คำถามแรกที่ดี!
Rotem

2
ในระดับพื้นฐานโปรแกรมที่ใช้ GUI จะถูกเรียกและการดำเนินการจะกลับมาที่พรอมต์ อาจเป็นเพราะเชลล์ไม่คาดหวังให้คำสั่งโต้ตอบกับมัน?
shahkalpesh

คำตอบ:


122

หากแอปพลิเคชันเป็นแอปพลิเคชัน Win32 GUI แอปพลิเคชันจะทำงานและพร้อมรับคำสั่งจะไม่รอให้แอปพลิเคชันออก

หากแอปพลิเคชันเป็นแอปพลิเคชันคอนโซลแอปพลิเคชันจะทำงานในพรอมต์คำสั่งและคุณจะต้องรอให้เสร็จสิ้นเพื่อรับพรอมต์คำสั่งกลับมา

แก้ไข:

ตกลง. ดูเหมือนว่าคุณต้องการคำอธิบายทางเทคนิค หากคุณต้องการที่จะเลียนแบบคุณลักษณะเดียวกันในใบสมัครของคุณคุณสามารถตรวจสอบIMAGE_OPTIONAL_HEADERของ exe ที่นี่

ข้างในIMAGE_OPTIONAL_HEADERมี:

 WORD                 Subsystem;

If SubSystem == 0x02 หมายความว่าเป็นแอปพลิเคชัน GUI

If SubSystem == 0x03 หมายความว่าเป็นแอปพร้อมรับคำสั่ง

แก้ไข 2:

หากคุณต้องการเห็นการดำเนินการ:

  1. ดาวน์โหลดhttp://www.ntcore.com/exsuite.php

  2. คัดลอก calc.exe หรือ notepad.exe ไปยังเดสก์ท็อปของคุณ

  3. เปิด calc.exe ที่คัดลอกใน CFF Explorer

  4. ไปที่ Nt Headers -> Optional Headers

  5. เปลี่ยน SubSystem จาก 0x002 เป็น 0x003

  6. บันทึกไว้

ตอนนี้เรียกใช้ Calc ที่แก้ไขใหม่แล้วคุณจะเห็นพรอมต์คำสั่งรอให้หยุดทำงาน


2
@SudhakarTillapudi ยินดีต้อนรับฉันอัปเดตคำตอบพร้อมรายละเอียดเพิ่มเติมหวังว่ามันจะอธิบายได้มากขึ้น
72DFBF5B A0DF5BE9

3
เป็นข้อมูลจริงๆอีกครั้งขอบคุณสำหรับการยังคงดีฉัน :)
Sudhakar Tillapudi

8

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

start /w notepad.exe

ด้วยวิธีนี้พรอมต์คำสั่ง / เชลล์สคริปต์จะดำเนินต่อไปหลังจากที่กระบวนการ notepad.exe สิ้นสุดลงแล้วเท่านั้น

หวังว่านี่จะช่วยได้ TW


3

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

ดังนั้นคำสั่งnotepadเพียงแค่เริ่มแอปพลิเคชัน Notepad และออกจากการควบคุมแอปพลิเคชัน ในขณะที่คำสั่งipconfigทำงานภายใต้โดเมน (ไม่ใช่นี่ไม่ใช่โดเมนแอปพลิเคชัน ) ของพรอมต์

เพื่อสรุปให้ชัดเจนยิ่งขึ้นเมื่อคุณใช้Process.Startในเทียบเท่า C # อย่ารอช้า มันจะไม่

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