2011-07-19 174 views
3

我用这个作为参考:http://msdn.microsoft.com/en-us/library/dd182449(v=VS.85).aspx为什么从C#应用代码调用Powershell时返回null?

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

$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

http://meta.stackexchange.com/questions/2950/应该,嗨,谢谢标语,并称呼,从帖子 – Kiquenet

回答

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 
+0

这。 Format-Table返回仅用于控制台格式处理的格式化对象。改用Select-Object。 – JasonMArcher

2

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

1

根据Technet,你的语法是错误的。 。 。

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

语法

GET-过程[[-Name] [-ComputerName] [-FileVersionInfo] [ - 模块] []

GET-过程-Id [ -ComputerName] [-FileVersionInfo] [ - 模块] []

GET-过程-InputObject [-ComputerName] [-FileVersionInfo] [-Modul e] []

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

编辑

牛米,我的同事是个白痴。我只需要将Remote.Computer.here换成.,它看起来都很好看。看看是否有效。

+0

删除使用“计算机”是我的一个错字。至于使用本地主机,我已经尝试过了,结果仍然是一样的。 – Jae

+0

尝试'.'而不是''localhost''。实际上,我必须大量修改该脚本才能使其正常工作。我不是PowerShell的专家,但他说脚本需要一些工作。 。 。 – surfasb

2

在PowerShell中,失败操作的默认值是什么都不返回。 PowerShell有几个众所周知的流,你的错误要么在于错误流([PowerShell] .Streams.Error),要么是终止错误([Powershell] .InvocationStateInfo.Reason)。

希望这有助于

+0

我检查了错误可能存在的提示,但是,Streams.Error和InvocationStateInfo.Reason都没有产生任何可能表明存在错误的提示。有一件事我很好奇,但如果我添加shell.AddCommand(“Out-String”),它将返回值..只能以字符串格式。所以这绝对是在那里,但是比平常要痛苦。 – Jae

+0

你应该试着看@ psobject.immediateBaseObject,而不是通过psobject戳@属性值(如上面的代码所示) –

+0

http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-和 - 称呼 - 从帖子中删除 – Kiquenet

相关问题