首页 > 解决方案 > 如何通过管道将哈希表传递给期望字典的 cmdlet?

问题描述

我在 C# 中编写了一个小的 PowerShell cmdlet,它需要一个字典的参数。如何在 PowerShell 脚本中构建 HashTable(或其他对象),以便可以将其作为参数传递给我的 cmdlet?

我尝试在我的 PowerShell 脚本中创建一个 HashTable,如下所示:

$dic = @{
    "Key1" = 1,2,3;
    "Key2" = "A","B","C";
}

然后将它传递到我的 cmdlet:

$props | Add-Properties

我的 cmdlet:

public class AddProps : PSCmdlet {
    [Parameter(ValueFromPipeline = true, Mandatory = true)]
    public Dictionary<string, object[]> Props {get; set;}

    protected override void ProcessRecord() {
        DoSomethingWithProps(Props);
    }
}

我希望能够像这样编写一个简短的 PowerShell 脚本:

$dic = @{
    "Key1" = 1,2,3;
    "Key2" = "A","B","C";
}

$props | Add-Properties

但是,当我尝试这个时,我得到了这个错误:

输入对象不能绑定到命令的任何参数,因为命令不接受管道输入,或者输入及其属性与接受管道输入的任何参数都不匹配

我检查了的类型,$props它确实是一个HashTable. 在查看了与此管道输入问题以及如何HashTable在 PowerShell 中构建相关的其他问题之后,我仍然不知道这里出了什么问题。

标签: c#powershell

解决方案


如果您不想将类型更改为,则可以使用接口解决此问题Hashtable

PS> [hashtable].GetInterfaces()

IsPublic IsSerial Name
-------- -------- ----
True     False    IDictionary
True     False    ICollection
True     False    IEnumerable
True     False    ISerializable
True     False    IDeserializationCallback
True     False    ICloneable

[Parameter(ValueFromPipeline = true, Mandatory = true)]
public IDictionary Props { get; set; }

推荐阅读