Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用PowerShell从C计算的属性#_C#_Powershell_Select - Fatal编程技术网

C# 使用PowerShell从C计算的属性#

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

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

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

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
,因此引用不存在的属性会导致错误。