有什么方法可以像通过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
答案 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>编程处理(您丢失了原始对象的类型信息,并且不能保证特定的输出格式具有长期稳定性)。
当然,您首先可以在中间步骤中存储原始输出对象,以保留它们以供以后进行编程处理。