如何将foreach-object输出传递给接受管道输入的函数?

时间:2019-06-29 08:00:04

标签: powershell

据我了解,这是一个非常简单的问题。这里有很多类似的问题,但是我一直无法找到我真正需要的东西。我想念什么?

预期产量

1 2 3

实际输出(错误)

cmdlet ForEach-Object at command pipeline position 1
Supply values for the following parameters:
Process[0]:

代码

function processItem {
  param($item)
  Process {
    $item
  }
}

$collection = @(1,2,3)

$collection | foreach-object | processItem

1 个答案:

答案 0 :(得分:4)

首先,您不必在这里使用Foreach-Object,因为管道将直接解包$items并一次将一个值发送到函数processItem

  

Passing Arrays to Pipeline

     

如果一个函数返回多个值,PowerShell会将它们包装在一个数组中。但是,如果将结果传递给管道内的另一个函数,则管道会自动“解包”数组并一次处理一个数组元素。

函数中的参数$item不接受代码中的管道输入,您应该像这样使用ValueFromPipeline

function processItem {
  param([parameter(ValueFromPipeline=$true)]$item)
  Process {
    $item
  }
}

像这样使用:

$items = @(1, 2, 3)
$items | processItem