我最近一直在写一个函数,它需要通过管道接受参数,我看到它的非常奇怪的行为。我有以下代码:
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函数只写最后一个元素?
答案 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