C# 如何使System.Management.Automation.PowerShell输出与run thru命令行相同
是否有任何方法可以以c#与通过powershell cmd手动运行命令时相同的方式获取powershell输出? 例如: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
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());
}
}