如何将哈希表通过管道传递给期望字典的cmdlet?

pav*_*xun 4 c# powershell

我用C#编写了一个小的PowerShell cmdlet,它期望使用Dictionary的参数。如何在PowerShell脚本中构造HashTable(或其他对象),以便可以将其作为参数传递给cmdlet?

我试过在PowerShell脚本中创建HashTable,如下所示:

$dic = @{
    "Key1" = 1,2,3;
    "Key2" = "A","B","C";
}
Run Code Online (Sandbox Code Playgroud)

然后将其通过管道传递到我的cmdlet:

$props | Add-Properties
Run Code Online (Sandbox Code Playgroud)

我的cmdlet:

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

    protected override void ProcessRecord() {
        DoSomethingWithProps(Props);
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够编写一个简短的PowerShell脚本,如下所示:

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

$props | Add-Properties
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试这样做时,出现此错误:

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

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

The*_*le1 5

如果您不想将类型更改为,则可以使用接口来解决此问题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
Run Code Online (Sandbox Code Playgroud)
[Parameter(ValueFromPipeline = true, Mandatory = true)]
public IDictionary Props { get; set; }
Run Code Online (Sandbox Code Playgroud)