使用C#中的PowerShell计算属性

时间:2015-07-13 11:03:42

标签: c# powershell select

所以我想从C#执行PowerShell计算属性(我希望这是正确的名称)。

PS(Exchange)控制台中的我的CmdLet如下所示:

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

这很好用,当我尝试从C#执行它时会出现问题。

我的代码如下:

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(null)。所以我尝试了没有第二个选择的命令,它显示它有列:

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

所以我的想法是,PowerShell并没有认识到这种重命名......现在我的问题是如何从C#中使用这样的东西?有没有解决方案?

2 个答案:

答案 0 :(得分:2)

在PowerShell中@{Name="RenamedColumn";Expression={$_.Name}}不是字符串而是Hashtable,所以在C#中你还必须创建一个Hashtable(或实现IDictionary的其他集合)来传递它到Select-Object cmdlet:

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

P.S。
如果你想要的只是重命名,那么你在这里不需要ScriptBlock

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

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

答案 1 :(得分: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();

我的代码动态运行,因此您无法查看生成的命令(调试中除外)。