2015-07-13 80 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(); 

我的代码工作动态的,所以你看不到哪个命令产生(除非在调试中...)