Как получить выходные данные объекта 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
в трубопровод в этом случае.