如果你已经熟悉了PowerShell中的参数绑定,不妨通过下面的例子了解一下PowerShell中一些鲜为人知的参数绑定功能。
Function Test-Function { param ( [Parameter(ValueFromPipeline=$true)] [Int] $Number1, [Parameter(ValueFromPipelineByPropertyName=$true)] [Int] $Number2 ) Process { " Number1=$Number1 , Number2=$Number2" } }
上面的函数Test-Function接受两个参数。两个参数都可以从管道中获取,第一个接受一个完整的管道结果,第二个期望接受一个包含“Number2”属性名的管道输入。所以会有两种不同的表现。
PS> 1..10 | Test-Function -Number2 6 Number1=1 , Number2=6 Number1=2 , Number2=6 Number1=3 , Number2=6 Number1=4 , Number2=6 Number1=5 , Number2=6 Number1=6 , Number2=6 Number1=7 , Number2=6 Number1=8 , Number2=6 Number1=9 , Number2=6 Number1=10 , Number2=6
整形数组通过管道将元素传递给参数-Number1,但是另外一个参数-Number2的值却一直是6,这也正如我们所设想。如果将一个脚本块传给参数-Number2,PowerShell 首先不会报错,它会尝试去执行这个脚本块,尽量得到自己需要的类型的结果。
PS> 5..10 | Test-Function -Number2 { $_ * 2 } Number1=5 , Number2=10 Number1=6 , Number2=12 Number1=7 , Number2=14 Number1=8 , Number2=16 Number1=9 , Number2=18 Number1=10 , Number2=20
上面的表现形式不是期望的,但是有时却很实用:第一,可以将本来不能传递给参数Number2的管道输入传递给了Number2,第二传递的是动态处理后的管道输入。最后再来演示ValueFromPipelineByPropertyName的功能:
PS>1..3 | foreach { $temp=New-Object psobject | select Number1,Number2 $temp.Number1=Get-Random -Maximum 100 $temp.Number2=Get-Random -Maximum 100 $temp } | Test-Function
输出为:
Number1=0 ,Number2=46 Number1=0 ,Number2=2 Number1=0 ,Number2=26
引用文章:Secret Script Block Parameters
本文链接: https://www.pstips.net/valuefrompipeline-and-valuefrompipelinebypropertyname.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!