使用C#中的PowerShell计算属性

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

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#中使用这样的东西?有什么解决方案吗?

最佳答案 在PowerShell @ {Name =“RenamedColumn”; Expression = {$_.Name}}不是字符串而是Hashtable,因此在C#中你还必须创建一个Hashtable(或实现IDictionary的其他集合)以将其传递给Select-对象cmdlet:

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

附:
如果你想要的只是重命名,那么你不需要ScriptBlock:

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

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