所以我想从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"}
}