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

Задний план

  • PowerShell 3 с SDK
  • C # с Framework 4.5

Выполнение

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

Проблема

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

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

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

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

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

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

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

Вопрос

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

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


person krs    schedule 11.10.2013    source источник
comment
Обычно возврат от _ 1_ является перечисляемым по выходным данным конвейера (для вывода ошибок используйте свойство Error того же экземпляра Pipeline). Поэтому, пожалуйста, обновите свой вопрос кодом, который вы используете для выполнения конвейеров PSH на вашем хосте.   -  person Richard    schedule 11.10.2013
comment
Привет, в конвейере совсем нет Error. Я не могу просто Pipeline.Invoke, поскольку мой CmdLets требует пользовательского интерфейса. Из-за этого я делаю это через пользовательские PSHost, PSHostUserInterface, где я могу переопределить действия пользователя и выполнить их.   -  person krs    schedule 14.10.2013


Ответы (1)


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

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

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

person Keith Hill    schedule 12.10.2013
comment
Добавление Out-Default помогло. Хммм, интересно, почему Out-String не помогло ... Я также попробую, что вы имеете дело с реальными объектами .NET. Большое спасибо, отмечая как ответ. - person krs; 14.10.2013
comment
Когда вы используете Out-Default, PowerShell преобразует объекты в строку и затем записывает на хост. С Out-String PowerShell преобразует объекты в строку и вернет эту строку в качестве вывода конвейера. Затем вы должны отобразить его после того, как он будет возвращен из pipeline.Invoke (). - person Keith Hill; 14.10.2013