12

我有一个脚本,我正在尝试向其中添加管道功能。不过,我看到了奇怪的行为,脚本似乎只针对管道中的最终对象运行。例如

param(
  [parameter(ValueFromPipeline=$true)]
  [string]$pipe
)

foreach ($n in $pipe) {
  Write-Host "Read in " $n
}

很简单,不是吗?然后我运行1..10 | .\test.ps1它只输出一行Read in 10。更复杂的是,我想在其中使用的实际脚本具有更多参数:

[CmdletBinding(DefaultParameterSetName="Alias")]
param (
  [parameter(Position=0,ParameterSetName="Alias")]
  [string]$Alias,

  [parameter(ParameterSetName="File")]
  [ValidateNotNullOrEmpty()]
  [string]$File

  <and so on>
)
4

1 回答 1

16

您需要使用 process{} 包装脚本的主体,这将允许您处理管道上的每个项目。由于将为每个项目调用进程,您甚至可以取消 for 循环。

因此,您的脚本将如下所示:

param(
  [parameter(ValueFromPipeline=$true)]
  [string]$pipe
)
process
{
      Write-Host "Read in " $pipe
}

您可以在此处阅读有关输入处理的信息:函数输入处理方法

于 2013-01-09T19:39:25.210 回答