为什么在c#应用程序代码中调用Powershell时返回null ?

本文关键字:Powershell 返回 null 调用 应用程序 代码 为什么 | 更新日期: 2023-09-27 18:02:29

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

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

$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[]。Value将简单地返回null。

帮忙吗?

谢谢。

为什么在c#应用程序代码中调用Powershell时返回null ?

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

在PowerShell中,对于失败的操作,默认是不返回任何内容。PowerShell有几个众所周知的流,你的错误要么在错误流中([PowerShell]. streams . error),要么是一个终止错误([PowerShell]. invocationstateinfo . reason)。

希望有帮助,

使用两个稍微不同的命令:一个用于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#中使用它。至于console,它应该是管道中的最后一个命令,它生成用于打印的对象,而不是用于进一步使用。示例:第一个命令显示两列nameID,但是第二个命令没有得到任何name属性:

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

根据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,而不是computer。我也不知道"远程。电脑。"这里是.. ..您可以使用localhost.

编辑

我的同事是个白痴。我只需要用.交换Remote.Computer.here,它看起来都很好。