2015-07-13 59 views
4

所以我想從C#執行PowerShell計算屬性(我希望這是正確的名稱)。使用C#中的PowerShell計算屬性

我在PS(交易所)控制檯小命令是這樣的:

Get-Something -ResultSize unlimited |Select-Object DisplayName,@{name="RenamedColumn;expression={$_.Name}},ToBeExpanded -Expand ToBeExpanded |Select-Object DisplayNameRenamedColumn,ToBeExpandedGuid 

這一切正常,當我嘗試從C#執行它的問題occures。

我的代碼看起來是這樣的:

List<string> parameters = new List<string>() 
      { 
       "DisplayName","@{{name=\"RenamedColumn\";expression={{$_.Name }} }}","ToBeExpanded" 
      }; 
List<string> parameters2 = new List<string>() 
      { 
       "DisplayName","RenamedColumn","ToBeExpanded","ToBeExpandedGuid" 
      }; 
    powershell.AddCommand("Get-Something"); 
    powershell.AddParameter("ResultSize","unlimited"); 
    powershell.AddCommand("Select-Object"); 
    powershell.AddParameter("Property",parameters); 
    powershell.AddParameter("ExpandProperty","ToBeExpanded"); 
    powershell.AddCommand("Select-Object"); 
    powershell.AddParameters("Property",parameters2); 

    result = powershell.Invoke(); 

我的結果,那麼包含空ToBeExpandedGuid(空)。於是,我就命令沒有第二個選擇,它讓我發現,它具有柱:

@{{name=\"RenamedColumn\";expression={{$_.Name }} }} 

所以我的想法是,PowerShell不承認這個重命名......現在我的問題我怎麼使用類似這來自C#?有沒有解決方法?

回答

2

在PowerShell中@{Name="RenamedColumn";Expression={$_.Name}}不是一個字符串而是Hashtable,所以在C#中,你還可以創建一個Hashtable(或其他徵收實施IDictionary)將它傳遞給Select-Object的cmdlet:

new Hashtable{ 
    {"Name","RenamedColumn"}, 
    {"Expression",ScriptBlock.Create("$_.Name")} 
} 

附:
如果你想要的是一個重命名,那麼你就不需要ScriptBlock這裏:

@{Name="RenamedColumn";Expression="Name"} 

new Hashtable{ 
    {"Name","RenamedColumn"}, 
    {"Expression","Name"} 
} 
+0

這就是我一直在尋找的謝謝!它解決了這個問題:) –

+0

所以我有另一個類似的問題。在這種情況下,我需要一個腳本塊:'@ {name = someName; expression = {$ _。SomeColumn.Child -join','}}'但這不適用於ScriptBlock ...我的C#代碼看起來像如下: 'new Hashtable(){ {「Name」,「someName」}, {「Expression」,ScriptBlock.Create(「$ _。SomeColumn.Child -join','」)} }' –

+0

@RaphaelFischer我沒有看到你的C#代碼有問題。究竟是什麼問題?例外,意外的結果還是別的?你能否提供代碼來重現問題([MCVE](http://stackoverflow.com/help/mcve))? – PetSerAl

0

@PetSerAl

下來下面這段代碼應該重現我的錯誤:

  List<object> parameters = new List<object>() 
       { 
        "Name", 
        new Hashtable() 
        { 
         {"Name","someName"}, 
         {"Expression",ScriptBlock.Create("$_.SomeColumn.Child -join ','")} 
        } 
       }; 
      powershell.AddCommand("Get-Something"); 
      powershell.AddCommand("Select-Object"); 
      powershell.AddParameter("Property", parameters); 

      powershell.Runspace.Open(); 
      Collection<PSObject> powershellResult = powershell.Invoke(); 
      powershell.Runspace.Close(); 

我的代碼工作動態的,所以你看不到哪個命令產生(除非在調試中...)