2011-06-22 83 views
2

我有这个使用PowerShell的简单程序。这只是一个概念证明,我在一个更大的应用程序中使用相同的代码。问题是无法读取下面代码中某些属性的值。读取Value属性会引发GetValueInvocationException异常。枚举PowerShell对象的属性抛出

这实际上甚至发生在随PowerShell SDK一起提供的Microsoft示例项目中。为什么是这样的,有没有解决方案?

static void Main(string[] args) 
    { 
     var powerShell = System.Management.Automation.PowerShell.Create(); 

     var runspace = RunspaceFactory.CreateRunspace(); 
     runspace.Open(); 
     Runspace.DefaultRunspace = runspace; 

     powerShell.Runspace = runspace; 
     powerShell.AddScript("Get-Process"); 
     var results = powerShell.Invoke(); 

     foreach (var prop in results.First().Properties) 
     { 
      try 
      { 
       Console.WriteLine(prop.Name + " : " + prop.Value); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(string.Format("Exception {0} on {1}", e.GetType(), prop.Name)); 
      } 
     } 

     Console.ReadKey(); 
    } 

回答

2

这是设计的问题(毕竟,它的目标对象属性的getter抛出)或问题(如果这种影响是不是在PowerShell中故意)。在这两种情况下,我们现在都无法做到这一点。也就是说,我们应该在这种vcases中使用try/catch方法。我们有一种选择是将报告提交:https://connect.microsoft.com/PowerShell/Feedback

试图让目标对象在C#代码(这是System.Diagnostics.Process,通过结果对象的BaseObject财产得到它),并访问该元凶财产。它会抛出,更可能,以及。

+0

是的,你可能是对的。我应该忽略这些属性。事情是,我一般这样做,并不知道代码中的BaseObject是什么。我之前(并想改变)所做的是使用PowerShell Job API。然后我没有这样的问题。但是当我查看返回的属性时,我发现在使用Job方法时,在我的示例中抛出异常的属性不可用。所以我想try/catch是要走的路。谢谢:) – LinusK

+0

是的,try/catch是我在自定义主机中处理未知对象时所做的事情(读取属性获取器可能抛出的对象)。 –