C# 使用PowerShell从C计算的属性#
所以我想从C#执行PowerShell计算属性(我希望这是正确的名称) PS(Exchange)控制台中的我的CmdLet如下所示:C# 使用PowerShell从C计算的属性#,c#,powershell,select,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,To
Get-Something -ResultSize unlimited |Select-Object DisplayName,@{name="RenamedColumn;expression={$_.Name}},ToBeExpanded -Expand ToBeExpanded |Select-Object DisplayNameRenamedColumn,ToBeExpandedGuid
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();
这很好,当我试图从C#执行它时,问题就出现了
我的代码如下所示:
Get-Something -ResultSize unlimited |Select-Object DisplayName,@{name="RenamedColumn;expression={$_.Name}},ToBeExpanded -Expand ToBeExpanded |Select-Object DisplayNameRenamedColumn,ToBeExpandedGuid
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();
所以我的想法是powershell无法识别此重命名。。。现在我的问题是如何使用C#中的类似内容?有什么解决方案吗?在PowerShell
{Name=“RenamedColumn”;Expression={$\uName}}
中,它不是一个字符串,而是一个哈希表
,因此在C#中,您还必须创建一个哈希表
(或实现IDictionary
的其他集合)以将其传递给选择对象
cmdlet:
new Hashtable{
{"Name","RenamedColumn"},
{"Expression",ScriptBlock.Create("$_.Name")}
}
附加说明如果只需要重命名,则不需要
ScriptBlock
此处:
@{Name="RenamedColumn";Expression="Name"}
new Hashtable{
{"Name","RenamedColumn"},
{"Expression","Name"}
}
@佩瑟拉尔
下面的代码应该会重现我的错误:
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();
List参数=新列表()
{
“姓名”,
新哈希表()
{
{“Name”,“someName”},
{“Expression”,ScriptBlock.Create(“$\ SomeColumn.Child-join',”)}
}
};
AddCommand(“获取某物”);
powershell.AddCommand(“选择对象”);
powershell.AddParameter(“属性”,参数);
powershell.Runspace.Open();
集合powershellResult=powershell.Invoke();
powershell.Runspace.Close();
我的代码是动态工作的,所以您无法看到生成了哪个命令(调试时除外…这就是我要找的,谢谢!!它解决了这个问题:)所以我有另一个类似的问题。在本例中,我需要一个脚本块:
@{name=someName;expression={$\u0.SomeColumn.Child-join',}
但这不能与ScriptBlock一起使用…我的C代码如下所示:新哈希表(){{“name”,“someName”},{“expression”,ScriptBlock.Create($\u0.SomeColumn.Child-join',”)
@RaphaelFischer我认为你的C代码没有问题。到底是什么问题?异常、意外的结果还是其他什么?你能提供代码来重现这个问题吗()?对不起,我忘了描述结果:D结果给了我PSObjects属性为“someName”,相应的值为null。因此,powershell似乎选择了计算属性的名称部分,但表达式部分似乎出现了问题。。。powershell的错误和警告流为empty@RaphaelFischer输入对象真的有SomeColumn
和后续的Child
属性吗?我建议您启用严格模式Set StrictMode-Version Latest
,因此引用不存在的属性会导致错误。