Làm thế nào để dấu nhắc lệnh biết khi nào cần chờ thoát?


90

Tôi đang cố gắng thực hiện mã lại dấu nhắc lệnh của Windows trong C #. Tôi đã tự hỏi làm thế nào dấu nhắc lệnh biết khi nào nên đợi quá trình bắt đầu thoát và khi nào không đợi quá trình được gọi thoát ra.

Ví dụ: nếu bạn nhập vào dấu nhắc lệnh "notepad", Notepad sẽ khởi chạy, nhưng bạn vẫn có thể thực hiện các lệnh khác. Tuy nhiên, nếu bạn mở một tiện ích như more.com, ping.exe hoặc một tiện ích khác, nó sẽ đợi chương trình thực thi kết thúc trước khi cho phép bạn thực thi một lệnh khác.

Làm thế nào để dấu nhắc lệnh biết khi nào cần chờ thoát và làm cách nào để mô phỏng hành vi này trong C #?


13
Câu hỏi đầu tiên tuyệt vời!
Rotem

2
Ở cấp độ rất cơ bản, các chương trình dựa trên GUI được gọi và việc thực thi quay trở lại lời nhắc. Có thể là do shell không mong đợi lệnh tương tác với nó?
shahkalpesh

Câu trả lời:


122

Nếu ứng dụng là ứng dụng Win32 GUI, nó sẽ chỉ chạy và dấu nhắc lệnh sẽ không đợi nó thoát.

Nếu ứng dụng là một ứng dụng bảng điều khiển, nó sẽ chạy trong dấu nhắc lệnh và bạn sẽ cần phải đợi nó hoàn tất để lấy lại dấu nhắc lệnh.

BIÊN TẬP:

ĐỒNG Ý. Có vẻ như bạn cần giải thích kỹ thuật. Nếu bạn muốn mô phỏng tính năng tương tự trong ứng dụng của mình, bạn có thể kiểm tra IMAGE_OPTIONAL_HEADERcác tệp EXE tại đây .

Bên trong IMAGE_OPTIONAL_HEADER, có:

 WORD                 Subsystem;

If SubSystem == 0x02 nó có nghĩa là nó là một ứng dụng GUI.

If SubSystem == 0x03 nó có nghĩa là nó là một ứng dụng nhắc lệnh.

CHỈNH SỬA 2:

Nếu bạn muốn xem nó hoạt động:

  1. Tải xuống http://www.ntcore.com/exsuite.php

  2. Sao chép calc.exe hoặc notepad.exe vào màn hình của bạn

  3. Mở calc.exe đã sao chép trong CFF Explorer

  4. Điều hướng đến Tiêu đề Nt -> Tiêu đề Tùy chọn

  5. Thay đổi Hệ thống con từ 0x002 thành 0x003

  6. Lưu nó

Bây giờ hãy chạy calc được sửa đổi mới và bạn sẽ thấy dấu nhắc lệnh chờ nó kết thúc.


2
@SudhakarTillapudi, bạn được chào đón, tôi đã cập nhật câu trả lời với nhiều chi tiết hơn, hy vọng nó sẽ giải thích thêm.
72DFBF5B A0DF5BE9 Ngày

3
nó thực sự nhiều thông tin một lần nữa cảm ơn bạn đã sửa chữa cho tôi :)
Sudhakar Tillapudi

8

Mặc định từ dấu nhắc lệnh là tạo ra chương trình GUI trong một tiến trình / ngã ba riêng biệt. Tuy nhiên, bạn có thể chạy notepad (hoặc chương trình GUI khác) nội tuyến với dấu nhắc lệnh / tập lệnh shell của bạn:

start /w notepad.exe

Bằng cách này, dấu nhắc lệnh / tập lệnh shell chỉ tiếp tục sau khi quá trình notepad.exe kết thúc.

Hy vọng điều này sẽ giúp, TW


3

Khi bạn bắt đầu một quy trình mới, một ứng dụng GUI trong ngữ cảnh này thực sự hoạt động bên ngoài ranh giới của lời nhắc, lời nhắc sẽ không đợi. Tuy nhiên, nếu bạn chạy một lệnh hoạt động hoàn toàn dưới ranh giới của phiên bản hiện tại của lời nhắc, thì lệnh đó sẽ đợi.

Vì vậy, lệnh notepadchỉ khởi động ứng dụng Notepad và để lại quyền kiểm soát ứng dụng. Trong khi, lệnh ipconfigchạy dưới một miền (đây không phải là miền ứng dụng ), của dấu nhắc.

Để cực kỳ tổng quát, khi bạn sử dụng Process.Starttrong C # tương đương, đừng đợi. Nó dù sao sẽ không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.