向PowerShell函数传递字符串数组未达预期效果
这绝对是PowerShell新手最容易踩的坑之一!我来给你把问题拆明白:
为什么添加第二个参数后出问题?
你单参数时调用正常,是因为PowerShell会自动把整个数组绑定到唯一的参数上。但加了第二个参数后,如果你用了类似C#的括号调用写法(比如test($arr, $true)),就会出问题!
在PowerShell里,函数调用的括号不是用来包裹参数列表的,而是用来分组表达式的。test($arr, $true)相当于把$arr, $true合并成一个新数组,然后作为单个参数传给$arrInFn。由于$arrInFn是[string[]]类型,PowerShell会把原字符串数组转换成一个拼接后的字符串(默认用空格分隔,如果你改了$OFS变量的话会直接无分隔拼接),再把布尔值$true转成字符串"True",最终$arrInFn变成了包含这两个字符串的数组——这就是你看到的“数组被拼接”的现象。
另外,如果调用时搞反了参数顺序(比如test $true $arr),$arrInFn会接收$true转成的字符串"True",长度变成1,也会让你误以为数组被“弄丢”了。
正确的调用方式
1. 标准PowerShell调用(无括号,空格分隔)
这是最常用的写法,按位置传递参数:
test $arr $true
此时PowerShell会把$arr完整绑定到$arrInFn,$true绑定到$something,函数里输出的数组长度就是3,和你预期一致。
2. 命名参数调用(推荐,更清晰)
如果担心参数顺序搞混,或者参数较多时,直接用参数名指定,完全不会出错:
test -arrInFn $arr -something $true
这种写法不管参数顺序怎么调整都能正确绑定。
3. 非要用括号的话(不推荐)
如果你习惯了C#风格的括号,必须把每个参数用括号单独包裹,用逗号分隔:
test($arr), ($true)
但这种写法在PowerShell里非常少见,容易引起混淆,还是推荐前两种方式。
额外小提示
如果想把数组的元素逐个作为参数传递(展开数组),可以用splatting语法@arr,但这和你现在要传递整个数组的需求相反,所以直接用$arr就好。
内容的提问来源于stack exchange,提问作者BLSully

