PowerShell 参数绑定之ValueFromPipeline和ValueFromPipelineByPropertyName


如果你已经熟悉了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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注