PowerShell通过C#控制台输出不同

时间:2015-12-17 18:50:02

标签: c# powershell

对C#来说相当新,对PowerShell来说并不新鲜。

我想使用C#来执行PowerShell代码。但是,对象的输出与PowerShell窗口中的运行命令不同。我找回了对象的名称,而不是它的数据。这是我正在尝试的内容:

string script = @"
    get-process | ft
";

PowerShell powerShell = PowerShell.Create();

powerShell.AddScript(script);
var results = powerShell.Invoke();
foreach (var item in results)
{
    Console.WriteLine(item);
}

返回:

  

Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData

但是,在PowerShell命令行窗口中,它返回一个更合理的表视图:

  

PS C:\ Dropbox \ PowerShell> ps |英尺

     

处理NPM(K)PM(K)WS(K)VM(M)CPU(s)Id SI   ProcessName   ------- ------ ----- ----- ----- ------ - - -----------       131 12 1980 2572 85 0.45 13216 1 acrotray

真的想要两件事:

  1. 将生成与PowerShell命令窗口相同的输出的代码
  2. 对正在发生的事情的解释,以便我可以学习如何更好地导航它
  3. 提前致谢!

2 个答案:

答案 0 :(得分:3)

我想通了,感谢codeproject上的代码示例,我发现命令“out-string”需要添加到所有命令的末尾。所以要添加的额外代码是:

  

ps.AddCommand( “OUT-字符串”);

我想知道控制台是否只是这样做,或者是否还有更多内容。

答案 1 :(得分:0)

PowerShell使用自己的XML格式文档在控制台和ISE中返回表格样式输出。 Out-String是这种格式在你的情况下发挥作用的地方,因为它将保留格式(你可以使用' -Stream'切换为out字符串以在执行时返回每一行)。

可以从传回C#的对象中提取信息,而不使用out-string;但是,根据我的经验,如果你只是显示这些信息;这是返回字符串的最佳选择。但是,如果需要对对象执行其他处理,则可以返回一个对象,然后根据要处理的对象类型执行条件。例如,如果我需要在从PowerShell返回后操作对象(不使用' out-string'),我使用以下内容:

System.Diagnostic.Process是Get-Process命令中返回的对象类型 - 确保您确切知道要传递回C#的对象类型

using (PowerShell psRunspace = PowerShell.Create())
        {
            psRunspace.AddCommand("Get-Process");
            psRunspace.AddParameter("ComputerName", computerName);

            Collection<PSObject> outputObj = psRunspace.Invoke();

            foreach (PSObject obj in outputObj)
            {
                var objProperties = obj.Properties;
                var objMethods = obj.Methods;
                var baseObj = obj.BaseObject;

                if (baseObj is System.Diagnostic.Process) 
                {
                    var p = (System.Diagnostic.Process)baseObj;
                    //you can now access all members of this object normally
                    //Do something here with p.Properties or p.Methods etc...
                }
            }

我也建议,因为我在你的问题中没有看到它,考虑使用&#39;使用&#39;用于执行powershell命令的语句。这将为您打开和关闭管道/运行空间。在您的示例中,除非您从示例代码中省略它,否则您似乎无法关闭该管道。此外,在您的invoke命令中特别指出您为要返回的对象使用适当的类型,并使用上面显示的Collection和您要返回的对象类型(PSObject)。