У меня проблемы с захватом вывода из 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);
}
}
Я надеюсь, что кто-то может мне помочь с этим!Спасибо за ваше время!