PowerShell使用&调用动态命名函数时参数传递失败问题咨询
问题核心原因
你代码的核心问题是误用了PowerShell内置自动变量$input作为自定义参数名:$input是PowerShell预留的自动变量,用于接收管道传入的集合对象,你在param块中定义同名参数会被系统自动覆盖,因此无法拿到传入的参数值。
解决步骤
1. 修改函数参数名
将函数的自定义参数名改为非自动变量的命名即可,推荐写法如下:
function translateDate { param ( $InputValue ) Write-Debug "translateDate: input: $InputValue" # 注意:PowerShell中判断空值推荐将$null放在左侧,避免参数为集合时出现判断异常 if ($null -eq $InputValue) { return "" } # YYYYMMDD if ($InputValue -match '.*(20\d\d[0-1]\d[0-3]\d).*') { Write-Debug "translateDate: YYYYMMDD" return $matches[1] } # DD.MM.YYYY if ($InputValue -match '([0-3]\d)\.([0-1]\d).(20\d\d)') { Write-Debug "translateDate: DD.MM.YYYY" return "$($matches[3])$($matches[2])$($matches[1])" } # 其余原有逻辑保持不变 return $InputValue }
2. 调用方式二选一即可
方式一:直接传值(单参数场景优先用)
不需要额外把参数包装成数组,直接传递变量即可:
$value = "Q32020" $translator ="Date" $cmd = "translate$translator" $value = & $cmd $value
方式二:数组展开传值(多参数场景适用)
如果你需要通过数组批量传递多个参数,可以使用PowerShell的 splatting 特性,在数组变量前加@展开参数列表:
$value = "Q32020" $translator ="Date" $cmd = "translate$translator" $argList = @($value) $value = & $cmd @argList
补充说明
如果直接使用& $cmd $argList的写法,PowerShell会把整个数组作为单个参数传入目标函数,如果你需要把数组的每个元素作为独立的多个参数传入,必须使用@符号的splatting写法。
内容的提问来源于stack exchange,提问作者YeOldHinnerk
相关产品推荐
相关产品推荐

