为什么在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。
帮忙吗?
谢谢。
检查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,它应该是管道中的最后一个命令,它生成用于打印的对象,而不是用于进一步使用。示例:第一个命令显示两列name和ID,但是第二个命令没有得到任何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,它看起来都很好。