C# 如何使System.Management.Automation.PowerShell输出与run thru命令行相同

C# 如何使System.Management.Automation.PowerShell输出与run thru命令行相同,c#,powershell,C#,Powershell,是否有任何方法可以以c#与通过powershell cmd手动运行命令时相同的方式获取powershell输出? 例如: PS C:\temp> gci Directory: C:\temp Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 19.10.2018 9:57

是否有任何方法可以以c#与通过powershell cmd手动运行命令时相同的方式获取powershell输出? 例如:

PS C:\temp> gci


    Directory: C:\temp


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        19.10.2018      9:57            SomeDir
-a---        13.11.2018     17:03       3306 Somelog.log
和c#代码:

附加一个调用
输出字符串的(最终)管道段
,该管道段生成的表示形式与您在控制台中看到的相同,即一个单行多行字符串:

  using (var ps = PowerShell.Create())
  {
    ps.AddScript("gci | Out-String");
    foreach (PSObject o in ps.Invoke())
    {
      Console.WriteLine(o.ToString());
    }
  }
使用默认输出线宽,您可以使用
-width
参数覆盖该线宽。
要将输出作为行集合而不是单个多行字符串接收,请使用
-Stream

如果希望对输出格式进行更多控制,可以在调用
输出字符串
之前使用另一个管道段,该管道段调用
格式-*
cmdlet之一,例如
格式表

注意事项:

正如所指出的,这种方法只适用于获取显示输出,因为生成的字符串不用于编程处理(您已经丢失了原始对象的类型信息,并且无法保证特定的输出格式具有长期稳定性)


当然,您首先可以在中间步骤中存储原始输出对象,以便保留它们以供以后的编程处理。

控制台将在PowerShell中为您处理格式设置,但您需要在自己的C代码中负责。@boxdog:谢谢-我在答案中添加了一个注释。
SomeDir
Somelog.log
  using (var ps = PowerShell.Create())
  {
    ps.AddScript("gci | Out-String");
    foreach (PSObject o in ps.Invoke())
    {
      Console.WriteLine(o.ToString());
    }
  }