我将此作为参考: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。
任何帮助?
感谢。
答案 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