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

时间:2018-11-16 13:10:42

标签: 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

和C#代码:

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

给我:

SomeDir
Somelog.log

1 个答案:

答案 0 :(得分:3)

附加一个(最终)管道段,该段调用Out-String ,从而产生与单个控制台一样的与在控制台中看到的相同的表示形式行字符串:

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

Out-String使用默认的输出线宽度,您可以使用-Width参数覆盖该宽度。
要以行的集合而不是单个多行字符串的形式接收输出,请使用-Stream

如果要进一步控制输出格式,可以在Out-String调用之前加入另一个调用Format-* cmdlet之一的管道段,例如Format-Table

注意:

正如boxdog所指出的,此方法仅适用于获取用于展示的输出,因为生成的字符串不适用于< em>编程处理(您丢失了原始对象的类型信息,并且不能保证特定的输出格式具有长期稳定性)。

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