Как получить выходные данные объекта Powershell CmdLet, когда CmdLet программно вызывается из C#

Фон

  • PowerShell 3 с SDK
  • C# с Framework 4.5

Реализация

Я реализовал свой собственный PSHost Alogn с PSHostUserInterface. В PSHostUserInterface я переопределяю все методы Write... и собираю одну переменную, которая обслуживает вывод.

проблема

В моем приложении я вызывал Cmdlets, которые используют WriteObject в качестве вывода. В методах PSHostUserInterface.Write... я получаю все, кроме вывода данных WriteObject. Например, я вижу это в обычном PowerShell:

Это пример строки вывода команды

Здесь у нас есть объект из функции Cmdlet.WriteObject

Это еще один вывод строки из команды

Вот что я получаю в своем пользовательском PSHost в своем приложении:

Это пример строки вывода команды

Это еще один вывод строки из команды

Вопрос

Как я могу получить в C# все выводы командлета?

Большое спасибо

1 ответ

Решение

Я думаю, что Ричард на это с его комментарием. Если вы вызываете командлеты с помощью Pipeline.Invoke(), вы должны либо:

  • A) Вызовите Pipeline.Invoke снова с этими объектами и направьте их в Out-Default или же
  • Б) Просто добавьте команду Out-Default к оригинальному трубопроводу. Это скажет PowerShell отправлять вывод на дисплей (и использовать форматирование по умолчанию).

Обычно, когда вы сохраняете результирующие объекты, которые выводятся конвейером, либо в переменную PowerShell $res = Get-Process или в C# как вывод Invoke()вы имеете дело с реальными объектами.NET. Форматирование и рендеринг этих объектов на хост - это еще один шаг, который PowerShell сделает для вас, если выходные данные конвейера не будут захвачены. PowerShell эффективно добавляет | Out-Default в трубопровод в этом случае.

Другие вопросы по тегам