从C#应用程序代码调用时,为什么Powershell返回null?

时间:2011-07-19 20:29:51

标签: c# .net powershell datatable

我将此作为参考:http://msdn.microsoft.com/en-us/library/dd182449(v=VS.85).aspx

所以实现非常相似。我正在执行以下PowerShell命令,通过下面的1-liner命令从目标计算机中检索进程信息:

$computer = "Remote.Computer.Here"; Get-Process -computer $computer | Sort-Object WorkingSet -desc | Select-Object -first 10 | Format-Table -property name, ID, @{Expression= {$_.WorkingSet/1mb};Label="MemoryLoad";} -auto

上面的命令在PS窗口中完美执行。但是,从C#应用程序代码调用时,我没有返回。尤其如此,当我通过以下方式访问它时:

        PowerShell shell = PowerShell.Create();
        shell.AddScript(CmdletMap[PSVocab.OsProcLoad]);
        Collection<PSObject> obj = shell.Invoke();

        DataTable dt = new DataTable();
        dt.Columns.Add("ProcessName");
        dt.Columns.Add("ID");
        dt.Columns.Add("MemoryLoad");

        DataRow row;
        foreach (PSObject resultObject in obj)
        {
            row = dt.NewRow();
            row["ProcessName"] = resultObject.Members["name"].Value;
            row["ID"] = resultObject.Members["id"].Value;
            row["MemoryCol"] = resultObject.Members["MemoryLoad"].Value;

            dt.Rows.Add(row);
        }

快速观察resultObject.Members []。值只返回null。

任何帮助?

感谢。

4 个答案:

答案 0 :(得分:2)

检查shell.Streams.Error以查看调用脚本时发生的错误。

答案 1 :(得分:2)

在PowerShell中,失败操作的默认设置是不返回任何内容。 PowerShell有几个众所周知的流,你的错误或者位于错误流中([PowerShell] .Streams.Error),或者它是一个终止错误([Powershell] .InvocationStateInfo.Reason)。

希望这有帮助,

答案 2 :(得分:1)

据Technet说,你的语法错了。 。

http://technet.microsoft.com/en-us/library/dd347630.aspx

  

语法

     

Get-Process [[-Name]] [ - ComputerName]   [-FileVersionInfo] [-Module] []

     

Get-Process -Id [-ComputerName]   [-FileVersionInfo] [-Module] []

     

Get-Process -InputObject [-ComputerName]   [-FileVersionInfo] [-Module] []

具体来说,您需要使用-computername,而不是计算机。我不知道“Remote.Computer.Here”是什么。 。 ..你可以使用localhost。

修改

嗯,我的同事是个白痴。我只需要将Remote.Computer.here与.交换,它看起来很好,花花公子。看看是否有效。

答案 3 :(得分:1)

使用两个略有不同的命令:一个用于C#(和控制台),另一个用于控制台。

从C#和控制台调用:

$computer = "."
Get-Process -computer $computer | Sort-Object WorkingSet -desc | Select-Object -first 10 |
Select-Object -property name, ID, @{Expression= {$_.WorkingSet/1mb};Label="MemoryLoad"}

对于具有更漂亮外观的交互式主机(即控制台,ISE等):

$computer = "."
Get-Process -computer $computer | Sort-Object WorkingSet -desc | Select-Object -first 10 |
Select-Object -property name, ID, @{Expression= {$_.WorkingSet/1mb};Label="MemoryLoad"} |
Format-Table -AutoSize

Format-Table在C#中出现问题。不要在C#中使用它。至于控制台,它应该是管道中的最后一个命令,它产生用于打印的对象,而不是用于进一步使用。示例:第一个命令显示两列名称 ID ,但第二个命令未获取任何名称属性:

Get-Process | Format-Table -property name, ID
Get-Process | Format-Table -property name, ID | Select-Object name