Powershell功能:管道和通用参数值之间的差异很大

时间:2014-09-24 17:58:08

标签: function powershell parameters pipeline

我对powershell处理函数参数的方式感到困惑。

所以我有这个样本ps模块,我只是为了测试目的,基于我的真实脚本:

function test {
[CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact='Medium')]

param(
    [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [System.Management.Automation.PSObject]$InputObject
)

Begin {
}
Process {
Write-Host $InputObject
}
End {
}
}

Export-Modulemember -function test

将其保存为test.psm1&导入,并进行2次测试:

第一次测试:

(get-process | select -first 5) | test

将返回:

System.Diagnostics.Process (7zFM)
System.Diagnostics.Process (7zFM)
System.Diagnostics.Process (AcroRd32)
System.Diagnostics.Process (AcroRd32)
System.Diagnostics.Process (AESTSr64)

第二次测试:

test -InputObject (get-process | select -first 5)

将改为:

System.Diagnostics.Process (7zFM) System.Diagnostics.Process (7zFM) System.Diagn
ostics.Process (AcroRd32) System.Diagnostics.Process (AcroRd32) System.Diagnosti
cs.Process (AESTSr64)

当我使用变量存储和转发数据时也会发生同样的情况。

powershell处理参数的方式似乎有所不同,使用-InputObject参数时我回来的数据似乎以某种方式松散了它的数组格式......

为什么这样做?有没有办法改变这种行为?

1 个答案:

答案 0 :(得分:4)

Powershell管道自动"展开"数组和集合一个级别,并将它们传递给下一个cmdlet或一次一个函数,因此当您通过管道发送该数组时,您的函数一次只处理一个进程对象。

当你使用参数时,你一次发送整个数组,你的函数正在处理一个数组对象,而不是一个进程对象,所以你会得到不同的结果。

试试这个,看看它是否对您的输出产生影响:

Process {
 $InputObject | foreach {Write-Host $_ }
}