Захват вывода из Powershell версии 2 - PullRequest
0 голосов
/ 08 июня 2018

У меня проблемы с захватом вывода из 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";

Это для запуска powershell в версии 2, и теперь он просто печатает 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);
  }
}

Я надеюсь, что кто-то может мне помочь с этим!Спасибо за ваше время!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...