2015-06-08 65 views
5

这里是我的代码:的WriteLine到已经运行的进程

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]}"); 
     } 
    } 
} 

我通过它的id有一个过程。这工作得很好 然后我试图发送一些东西给它的stdin。抛出一个InvalidOperationException。注意:当我尝试获取StandardInput时,发生异常,而不是当我尝试使用WriteLine时。

我相信我知道为什么我得到了例外。该过程不是由我的应用程序启动的,所以我从来没有机会将RedirectStandardInput设置为true。

我的目标是能够使用此应用程序发送文本到Python交互式控制台(或其他语言)。我仍然希望能够自己输入文本到Python提示符,但我也想给我的应用程序控制。

我该怎么做?

+0

这对你有帮助吗? http://stackoverflow.com/questions/10390829/is-it-possible-to-talk-with-running-process – ragerory

+0

对于那些困惑的人:'$'前缀是C#6(字符串插值)的一部分。 –

+1

@ragerory我看到了,但假设你控制这两个过程。我无法控制python提示符。我可以编写一个流程启动器,通过它我可以启动任何我想要发送的内容,但这有点笨拙。 – phil

回答

2

那么,你击中了头部的指甲。除非你自己开始这个过程,否则你不拥有这些通信流 - 并且没有一个真正的(合理的)解决方法。

如果您默认运行控制台应用程序,它将在cmd中运行 - 那是谁拥有这些流。如果你希望你的应用程序“主办”这个过程,你必须成为启动它的人。您只需要学习拨打myHoster myApp而不是start myApp :)

您可能还想考虑编写PowerShell主机。这可以让你很容易地处理一个交互式shell,尽管你必须学会​​使用PowerShell而不是CMD :)这很容易实现,PowerShell真的是可扩展的。

相关问题