2011-06-22 88 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是我在自定義主機中處理未知對象時所做的事情(讀取屬性獲取器可能拋出的對象)。 –