从 C# 以编程方式调用 CmdLet 时,如何捕获 Powershell CmdLet 的对象输出

krs*_*krs 5 c# powershell pshost

背景

  • 带有 SDK 的 PowerShell 3
  • 带有框架 4.5 的 C#

执行

我已经用PSHostUserInterface实现了我自己的PSHost alogn。在PSHostUserInterface 中,我覆盖了所有Write...方法并将其收集到一个用于输出的变量。

问题

在我的应用程序中,我调用了使用WriteObject作为输出的Cmdlets。在PSHostUserInterface.Write...方法中,我得到了除这些WriteObject输出之外的所有内容。例如,我在常规 PowerShell 中看到了这一点:

这是命令的示例字符串输出

这里我们有来自 Cmdlet.WriteObject 函数的对象

这是命令的另一个字符串输出

这是我在我的应用程序中的自定义 PSHost 中得到的:

这是命令的示例字符串输出

这是命令的另一个字符串输出

如何在 C# 中获取 Cmdlet 的所有输出?

非常感谢

Kei*_*ill 2

我认为理查德的评论是对的。如果您使用 调用 cmdlet Pipeline.Invoke(),则必须:

  • A) 使用这些对象再次调用 Pipeline.Invoke 并将它们通过管道传输到Out-Default
  • B) 只需将命令附加Out-Default到原始管道即可。这将告诉 PowerShell 将输出发送到显示器(并使用默认格式)。

通常,当您将管道输出的结果对象存储在 PowerShell 变量中$res = Get-Process或 C# 中作为 的输出时Invoke(),您正在处理实际的 .NET 对象。如果未捕获管道输出,则 PowerShell 将为您执行的另一个步骤是将这些对象格式化并渲染到主机。在这种情况下,PowerShell 有效地将 a 附加| Out-Default到管道。