PowerShell 5.1接收函数签名能否定义splatting参数?
PowerShell 5.1 函数签名接收splatting参数问题解答
- 核心结论:无法在函数
param参数块中直接通过@参数名的形式声明splatting接收参数。 - 原理说明:
Splatting(散列传参)是PowerShell调用侧的语法糖,不属于参数定义层的语法规则:调用函数时书写DoWork @test,执行逻辑是把$test存储的哈希表(命名参数传参场景)或数组(位置参数传参场景)拆分为独立参数项,按参数名/位置绑定到目标函数的对应形参,不会自动将整个散列/数组集合作为单个参数值传入。 - 正确实现方案:
如果需要接收完整的散列参数集合,后续直接透传给下游其他函数,只需要在参数块中定义对应类型的普通形参即可:- 对应命名参数splat场景,定义
[hashtable]类型参数承接 - 对应位置参数splat场景,定义数组类型参数承接
承接参数后,调用下游函数时直接对该形参变量使用splat语法传参,就能实现预期的透传效果。
如果你需要透传当前函数所有已绑定的入参,也可以直接使用PowerShell内置的$PSBoundParameters自动变量,不需要额外自定义参数承接,直接对该变量做splat传参即可。
- 对应命名参数splat场景,定义
修正后可直接运行的代码示例
function main { $test = @{p1='a';p2='b'} DoWork @test } function DoWork { # 定义哈希表类型的普通参数承接散列集合即可,参数声明处不需要使用@符号 param([hashtable]$test) # 对承接的参数直接使用splat语法,透传给下游函数 DoWork2 @test } function DoWork2 { param($p1, $p2) Write-Host "p1值:$p1,p2值:$p2" } main
执行上述代码会正常输出p1值:a,p2值:b,符合透传splat参数的需求。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

