Powershell喷溅操作符仅适用于接受的参数?

时间:2019-03-21 17:09:33

标签: powershell

当哈希表包含该函数接受的更多条目时,是否有可能使用PowerShell从哈希表使用splatting?

我的用例是让配置对象从一个函数传递给另一个函数。但是,所有功能都不需要相同的参数。

例如:

function Process-Something{
    param(
        [Parameter()]
        [string]$Owner
    )


}

function Process-SomethingElse{
    param(
        [Parameter()]
        [string]$Owner,
        [Parameter()]
        [int]$x,
        [Parameter()]
        [int]$y

    )
}


$config = @{
    "Owner" = "Bart Simpson"
    "X" = 10
    "Y" = 20
}

Process-Something @config
Process-SomethingElse @config

由于以下错误而失败:

Process-Something : Cannot find a matching parameter « Y ».

该想法是避免为每个函数指定单独的属性。

1 个答案:

答案 0 :(得分:2)

正如@Ansgar在评论中指出的那样,定义参数的整个想法是要进行验证。在将参数放置到函数中时,您将强制将其保留在函数中。因此,如果哈希表的给定属性不作为参数存在,则会出现错误-就像预期的那样。

能做的所要做的就是进入PSCustomObject并利用管道。如果使用属性名称(ValueFromPipelineByPropertyName = $true)设置所有参数以接受管道中的值,则实际上可以得到所需的行为。

首先,我将重新定义您的不同功能,以配置ValueFromPipelineByPropertyName = $true参数属性。

function Process-Something{
    param(
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [string]$Owner
    )

    $PSBoundParameters
}

function Process-SomethingElse{
    param(
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [string]$Owner,
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [int]$x,
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [int]$y

    )

    $PSBoundParameters
}    

有了这个,我就可以像您的示例一样创建一个哈希表,将其转换为PSCustomObject,现在我可以将该新对象通过管道传递给不同的方法,并让它们仅选择所需的属性。

我加入了PSBoundParameters,以展示他们得到了他们期望的结果。 测试是这样完成的:

$config = @{
    "Owner" = "Bart Simpson"
    "X" = 10
    "Y" = 20
}

$psConfig = [PSCustomObject]$config

$psConfig | Process-Something

$psConfig | Process-SomethingElse

enter image description here