如何使 System.Management.Automation.PowerShell 输出与通过命令行运行相同

Ksi*_*ice 6 c# powershell

有没有办法以与通过 powershell cmd 手动运行命令相同的方式在 C# 中获取 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
Run Code Online (Sandbox Code Playgroud)

和 C# 代码:

PowerShell ps = PowerShell.Create();
ps.AddCommand("gci");
ICollection<PSObject> results = ps.Invoke();
foreach (PSObject invoke in results)
{
   Console.WriteLine(invoke.ToString());
}
Run Code Online (Sandbox Code Playgroud)

给我:

SomeDir
Somelog.log
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 8

附加一个调用 的(最终)管道段Out-String,它会生成与您在控制台中看到的相同的表示形式,作为单个多行字符串:

  using (var ps = PowerShell.Create())
  {
    ps.AddScript("gci | Out-String");
    foreach (PSObject o in ps.Invoke())
    {
      Console.WriteLine(o.ToString());
    }
  }
Run Code Online (Sandbox Code Playgroud)

Out-String使用默认的输出行宽度,您可以使用参数覆盖它-Width
要将输出作为行集合而不是单个多行字符串接收,请使用-Stream.

如果您想要对输出格式进行更多控制,可以在调用之前Out-String添加另一个调用其中一个Format-*cmdlet 的管道段,例如Format-Table.

警告:

正如boxdog指出的那样,这种方法仅适合获取for-display输出,因为生成的字符串并不意味着用于编程处理(您已经丢失了原始对象的类型信息,并且无法保证特定的输出格式)具有长期稳定性)。

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