PowerShell函数管道传递多参数出现重复赋值,请求技术指导
问题原因分析
你的两个参数都声明了ValueFromPipeline=$true,PowerShell的管道机制会将每个输入对象同时绑定到所有接受管道输入的参数。所以当"one"通过管道时,$jeden和$dwa都会被赋值为"one";当"two"进来时,两个参数又同时被赋值为"two",这就导致了重复输出的结果。
解决方案
根据你的需求,提供几种针对性的解决方式:
方式1:通过自定义对象绑定属性传递
修改函数参数为按属性名接收管道输入,然后传递包含对应属性的自定义对象:
function Test{ [cmdletbinding()] param( [parameter(ValueFromPipelineByPropertyName=$true, Mandatory=$true)] [string]$jeden, [parameter(ValueFromPipelineByPropertyName=$true, Mandatory=$true)] [string]$dwa ) Process{write-host "$jeden PLUS $dwa"} } # 传递带对应属性的自定义对象 [PSCustomObject]@{jeden='one'; dwa='two'} | Test
方式2:传递数组作为单个管道对象
让函数接收数组参数,在处理块中拆分对应值:
function Test{ [cmdletbinding()] param( [parameter(ValueFromPipeline=$true, Mandatory=$true)] [string[]]$InputObject ) Process{ if($InputObject.Count -eq 2){ write-host "$($InputObject[0]) PLUS $($InputObject[1])" } } } # 用逗号强制将数组作为单个对象传入管道 ,"one", "two" | Test
方式3:直接使用位置/命名参数(无需管道)
如果不需要管道传递,直接按参数位置或名称调用函数:
# 按位置参数调用 Test "one" "two" # 按命名参数调用 Test -jeden "one" -dwa "two"
扩展:批量处理多组参数
如果需要处理多组类似(one,two)、(three,four)的参数,可以传递自定义对象数组:
$batchData = @( [PSCustomObject]@{jeden='one'; dwa='two'}, [PSCustomObject]@{jeden='three'; dwa='four'} ) $batchData | Test
内容的提问来源于stack exchange,提问作者Nawad-sama
相关产品推荐
相关产品推荐

