ValueFromPipeline的$ null

时间:2014-02-07 11:55:03

标签: powershell

我最近一直在写一个函数,它需要通过管道接受参数,我看到它的非常奇怪的行为。我有以下代码:

Function Write-A
{
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline=$true)]
        [string]$InputObject
    )
    Write-Host $InputObject
}

1,2,3 | Write-A 
1,2,3 | % { Write-Host $_ }

这些是脚本的输出:

3
1
2
3

为什么Write-A函数只写最后一个元素?

2 个答案:

答案 0 :(得分:0)

您只将数组中的最后一个元素传递给您的函数。你需要循环遍历每个项目:

1,2,3 | % { Write-A $_ }

或者,您可以让您的函数采用如下数组:

Function Write-A
{
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline=$true)]
        [array]$InputObject
    )
    $InputObject | % { Write-Host $_ }
}

Write-A 1,2,3

答案 1 :(得分:0)

好的,如果你打算使用管道,你已经发现需要一个Process块。

至于为什么它没有给你一个错误,请记住管道将集合和数组“展开”到一个单独的对象流中。由于您正在通过管道传递该数组,因此您的函数一次看到一个数字,在通过管道时将每个数字转换为[string]。

尝试将其作为参数传递,以便管道不会展开它,看看会发生什么:

 Function Write-A
{
   [CmdletBinding()]
  param(
    [Parameter(ValueFromPipeline=$true)]
    [string]$InputObject
  )
    Write-Host $InputObject
}


Write-A 1,2,3