2015-06-08 15 views
5

Đây là mã của tôi:WriteLine để chạy quá trình

static void Main(string[] args) 
{ 
    if(args.Length > 1) 
    { 
     int id; 
     if(int.TryParse(args[0], out id)) 
     { 
      try 
      { 
       var p = Process.GetProcessById(id); 
       p.StandardInput.WriteLine(args[1]); 
      } 
      catch (ArgumentException) 
      { 
       Console.WriteLine($"Couldn't find process with id {id}"); 
      } 
     } 
     else 
     { 
      Console.WriteLine($"Couldn't find process with id {args[0]}"); 
     } 
    } 
} 

Tôi có một quá trình id của nó. Điều đó làm việc tốt Sau đó, tôi đã cố gắng để gửi một cái gì đó để stdin của nó. Điều đó đã ném một InvalidOperationException. Lưu ý: ngoại lệ xảy ra khi tôi cố gắng lấy StandardInput, không phải khi tôi cố gắng viết cho chúng tôi WriteLine.

Tôi tin rằng tôi biết lý do tại sao tôi có ngoại lệ. Quá trình này không được khởi động bởi ứng dụng của tôi, vì vậy tôi không bao giờ có cơ hội để đặt RedirectStandardInput thành true.

Mục tiêu của tôi là có thể sử dụng ứng dụng này để gửi văn bản tới giao diện điều khiển tương tác python (hoặc một ngôn ngữ khác). Tôi vẫn muốn có thể tự nhập văn bản vào dấu nhắc python, nhưng tôi cũng muốn kiểm soát ứng dụng của mình.

Làm cách nào để thực hiện việc này?

+0

Điều này có giúp ích cho bạn không? http://stackoverflow.com/questions/10390829/is-it-possible-to-talk-with-running-process – ragerory

+0

Đối với những người nhầm lẫn: tiền tố '$' là một phần của C# 6 (nội suy chuỗi). –

+1

@ragerory Tôi thấy điều đó, nhưng điều đó giả định rằng bạn kiểm soát cả hai quy trình. Tôi không kiểm soát được dấu nhắc python. Tôi có thể viết một quá trình khởi động thông qua đó tôi sẽ bắt đầu bất cứ điều gì tôi muốn gửi một cái gì đó đến, nhưng đó là một chút clunky. – phil

Trả lời

2

Vâng, bạn nhấn vào móng trên đầu. Trừ khi bạn bắt đầu quá trình, bạn không sở hữu luồng truyền thông - và thực sự không có cách nào (hợp lý) xung quanh vấn đề này.

Nếu bạn chạy ứng dụng bảng điều khiển theo mặc định, ứng dụng sẽ chạy ở cmd - đó là người sở hữu các luồng. Nếu bạn muốn ứng dụng của mình "lưu trữ" quy trình, bạn sẽ phải là người khởi động nó. Bạn chỉ cần học cách gọi số myHoster myApp thay vì start myApp :)

Bạn cũng có thể muốn xem xét mã hóa máy chủ PowerShell. Điều này sẽ cho phép bạn dễ dàng xử lý một trình bao tương tác, mặc dù bạn phải học cách sử dụng PowerShell thay vì CMD :) Nó khá dễ thực hiện, PowerShell thực sự khá mở rộng.

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