当哈希表包含该函数接受的更多条目时,是否有可能使用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 ».
该想法是避免为每个函数指定单独的属性。
答案 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