【问题标题】:How to pipe hashtable to cmdlet expecting dictionary?如何通过管道将哈希表传递给期望字典的 cmdlet?
【发布时间】:2019-02-12 16:11:03
【问题描述】:

我用 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。在查看了与此管道输入问题以及如何在 PowerShell 中构建HashTable 相关的其他问题之后,我仍然不知道这里出了什么问题。

【问题讨论】:

    标签: c# powershell


    【解决方案1】:

    如果您不想将类型更改为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; }
    

    【讨论】:

    • 我将Props 属性修改为使用IDictionary&lt;string, object[]&gt; 类型,但在使用更新后的模块时仍然收到相同的错误
    • @pavuxun 定义接口时没有指定K,V。
    • 哦,我没有意识到我还在使用 Generic 类型,它确实需要 K,V
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2014-12-18
    • 2017-06-25
    相关资源
    最近更新 更多