所以我想从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#中使用这样的东西?有没有解决方案?
答案 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();
我的代码动态运行,因此您无法查看生成的命令(调试中除外)。