2010-07-22 59 views
10

Tôi có thể chạy một quy trình dòng lệnh bằng cách sử dụng process.start(). Tôi có thể cung cấp đầu vào bằng cách sử dụng đầu vào tiêu chuẩn. Sau đó, khi quá trình yêu cầu đầu vào của người dùng một lần nữa, làm thế nào để chương trình của tôi biết và truyền đầu vào cho exe đó?Chạy dòng lệnh tương tác exe bằng cách sử dụng C#

+0

Bạn có thể quan tâm đến [bài đăng này] (http://www.codeducky.org/process-handling-net) bao gồm nhiều sự phức tạp khi làm việc. NET quy trình, đặc biệt là xung quanh làm việc với đầu vào và đầu ra – ChaseMedallion

Trả lời

10

Có một example here rằng âm thanh tương tự như những gì bạn cần, sử dụng Process.StandardInputStreamWriter .

 Process sortProcess; 
     sortProcess = new Process(); 
     sortProcess.StartInfo.FileName = "Sort.exe"; 

     // Set UseShellExecute to false for redirection. 
     sortProcess.StartInfo.UseShellExecute = false; 

     // Redirect the standard output of the sort command. 
     // This stream is read asynchronously using an event handler. 
     sortProcess.StartInfo.RedirectStandardOutput = true; 
     sortOutput = new StringBuilder(""); 

     // Set our event handler to asynchronously read the sort output. 
     sortProcess.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler); 

     // Redirect standard input as well. This stream 
     // is used synchronously. 
     sortProcess.StartInfo.RedirectStandardInput = true; 
     sortProcess.Start(); 

     // Use a stream writer to synchronously write the sort input. 
     StreamWriter sortStreamWriter = sortProcess.StandardInput; 

     // Start the asynchronous read of the sort output stream. 
     sortProcess.BeginOutputReadLine(); 
     Console.WriteLine("Ready to sort up to 50 lines of text"); 
     String inputText; 
     int numInputLines = 0; 
     do 
     { 
      Console.WriteLine("Enter a text line (or press the Enter key to stop):"); 

      inputText = Console.ReadLine(); 
      if (!String.IsNullOrEmpty(inputText)) 
      { 
       numInputLines ++; 
       sortStreamWriter.WriteLine(inputText); 
      } 
     } 

hy vọng rằng sẽ giúp

+0

cảm ơn một lần nữa. nhưng điều này là cụ thể cho sort.exe i m tạo exe tại thời gian chạy cho mọi người dùng. tôi không biết anh ấy sẽ gõ chương trình nào. – rajshades

+0

Tôi nghĩ bạn có thể sử dụng "cmd.exe" thay vì tệp thực thi mà họ đã chọn. Đó là một hack, nhưng nó có thể nhận được công việc làm –

+0

Thưa robert u có thể giải thích làm thế nào để sử dụng cmd.exe cho vấn đề của tôi – rajshades

2

Nếu tôi hiểu chính xác, tôi nghĩ bạn có thể thực hiện điều này bằng cách chuyển hướng Đầu vào/Đầu ra tiêu chuẩn bằng cách sử dụng RedirectStandardOutputRedirectStandardInput.

Dự án WinSCP có mẫu C# để biết cách giao tiếp với nó bằng cách này. Bạn có thể tìm thấy nó ở đây: SFTP file transfers in .NET (mặc dù mẫu này chỉ thu thập đầu ra mà không sử dụng nó ở tất cả, nhưng kỹ thuật này nên được như vậy.)

+0

cảm ơn cho trả lời ur. tôi đã thử nó. nhưng quá trình yêu cầu đầu vào của người dùng không được xác định trước. kịch bản giống như 1. Tôi muốn thiết kế trình biên dịch trực tuyến cho C# 2. tôi có thể xây dựng chương trình bằng cách sử dụng mã dom n cretae exe 3. bây giờ tôi muốn chạy exe đó qua C# 4. người dùng có thể viết bất kỳ loại chương trình cần đầu vào của người dùng ở giai đoạn khác. hy vọng u hiểu toàn bộ kịch bản – rajshades

+0

@rajshades: Tôi đã nghĩ rằng sẽ tương tự, mặc dù thay vì gửi tất cả các lệnh trong một lần, bạn sẽ gửi một lệnh, đọc đầu ra, gửi lệnh tiếp theo vv Mặc dù tôi đã không thử nghiệm này. Như một lưu ý chung mặc dù, nếu bạn đang tạo exe, bạn có thể cố gắng để cung cấp cho nó một số cách tốt hơn để giao tiếp với nó (WCF, TCP/IP sockects, tên ống vv)? –

1

Bạn muốn tìm kiếm IPC. Như robert đã trình bày ở trên, lớp học Process trong .NET sẽ giúp bạn. Nhưng cụ thể cho vấn đề của bạn (làm thế nào để biết khi nào cần viết dữ liệu): Bạn không thể. Không nói chung.

Nếu bạn biết đầu vào được yêu cầu (ví dụ: "yyy"), bạn có thể cung cấp nó trong STDIN của quá trình được tạo. Bạn không phải chờ chương trình yêu cầu thông tin này: Nó sẽ chỉ đọc từ STDIN khi nó muốn dữ liệu.

Nếu bạn cần xử lý đầu ra chương trình để quyết định nội dung cần ghi vào STDIN, hãy thử đọc các quy trình STDOUT. Bạn có thể gặp vấn đề với xả nước, mặc dù ...

Các vấn đề liên quan