首页 > 解决方案 > 如何将 foreach-object 输出传递给接受管道输入的函数?

问题描述

据我了解,这是一个非常简单的问题。这里有很多类似的问题,但我无法准确找到我需要的东西。我错过了什么?

预期产出

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

标签: powershell

解决方案


首先,您不必Foreach-Object在此处使用,因为管道将直接打开包装$items并将一个值一次发送到您的函数processItem

将数组传递给管道

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

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

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

像这样使用:

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

推荐阅读