从Powershell版本2捕获输出

时间:2018-06-08 08:09:10

标签: c# powershell process powershell-v2.0 stdout

我无法捕获Powershell版本2的输出。 我使用常规的Process类来运行程序并处理输入和输出,一切都很好。下面的工作代码:

using (Process p = new Process())
{
  p.StartInfo.UseShellExecute = false;
  p.StartInfo.RedirectStandardInput = true;
  p.StartInfo.RedirectStandardOutput = true;
  p.StartInfo.RedirectStandardError = true;
  p.StartInfo.FileName = "powershell";
  //p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
  p.OutputDataReceived += (sender, args) => AddRow(args.Data);
  p.ErrorDataReceived += (sender, args) => AddRow("ERR: " + args.Data);

  p.Start();

  ps = p.StandardInput;
  p.BeginOutputReadLine();
  p.BeginErrorReadLine();

  Thread.Sleep(1000);
  ps.WriteLine("dir");
  Thread.Sleep(100);

  while (true)
  {
      Thread.Sleep(10);
  }
}

此版本启动PowerShell并发送" dir"到进程的stdinput,结果被发送回stdout。我可以看到cmd窗口,但我不能按预期写入或看到任何输出。 (我知道我可以隐藏它。)

但后来我添加了这一行:

p.StartInfo.Arguments = "-version 2";

这是在版本2中启动powershell,现在它只打印2行,告诉我PowerShell已启动,然后连接丢失。 我在控制台窗口中看到光标闪烁,现在我可以在命令窗口中与powershell交互,因为与我的进程类的连接丢失了。当我进入"退出"在窗口中,我又回到了我的过程中。

我该如何解决这个问题?

下面的完整代码(当使用不起作用的版本2时):

using (Process p = new Process())
{
  p.StartInfo.UseShellExecute = false;
  p.StartInfo.RedirectStandardInput = true;
  p.StartInfo.RedirectStandardOutput = true;
  p.StartInfo.RedirectStandardError = true;
  p.StartInfo.FileName = "powershell";
  p.StartInfo.Arguments = "-version 2";
  //p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
  p.OutputDataReceived += (sender, args) => AddRow(args.Data);
  p.ErrorDataReceived += (sender, args) => AddRow("ERR: " + args.Data);
  p.Start();

  ps = p.StandardInput;
  p.BeginOutputReadLine();
  p.BeginErrorReadLine();

  Thread.Sleep(1000);
  ps.WriteLine("dir");
  Thread.Sleep(100);

  while (true)
  {
    Thread.Sleep(10);
  }
}

我希望有人可以帮助我!谢谢你的时间!

0 个答案:

没有答案