如何将ValueFromRemainingArguments参数转发给PowerShell函数?
PowerShell 参数转发正确实现方法
问题根源
直接使用Command1 $Remaining时,PowerShell会把整个$Remaining数组当作单个位置参数传递给Command1的第一个参数$Target,但数组内的-Target和Test是命令行参数格式,无法被正确解析为命名参数,最终触发类型转换错误。
正确解决方案:使用Splatting(参数展开)
要让PowerShell像解析原始命令行参数一样处理$Remaining,需要用**@符号**代替$符号展开数组,这就是PowerShell的参数展开(Splatting)特性:
Switch ($Command) { 'Command1' { Command1 @Remaining } # ... }
完整修改后的脚本
Param( [Parameter(Mandatory)] [ValidateSet('Command1', 'Command2')] $Command, [Parameter(ValueFromRemainingArguments)] [string[]]$Remaining ) function Command1() { Param( [Parameter(Mandatory)] [string]$Target, [string]$Option = 'Default' ) # 测试参数是否正确接收 Write-Host "Target: $Target, Option: $Option" } function Command2() { # 示例实现 Param( [string]$Name ) Write-Host "Name: $Name" } Switch ($Command) { 'Command1' { Command1 @Remaining } 'Command2' { Command2 @Remaining } }
其他无效方法说明
Invoke-Expression Command1 $Remaining:将参数当作字符串拼接执行,容易出现引号转义问题,且存在注入风险,不推荐。powershell ${function:Command1} -Args $Remaining:会启动新的PowerShell进程执行函数,完全没必要,且同样无法正确解析命名参数。Start-Process:用于启动独立外部进程,不适合调用当前脚本内的函数,会徒增复杂度。
内容的提问来源于stack exchange,提问作者Maarten ten Velden
相关产品推荐
相关产品推荐

