脚本似乎只处理管道中的最后一个对象

AST*_*813 8 powershell pipeline

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

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

foreach ($n in $pipe) {
  Write-Host "Read in " $n
}
Run Code Online (Sandbox Code Playgroud)

死简单,不是吗?然后我跑了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>
)
Run Code Online (Sandbox Code Playgroud)

Dav*_*tin 11

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

所以你的脚本将如下所示:

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

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

  • 是的,这就是诀窍。我想如果您使用 process{} 块,则整个脚本主体必须在其中或开始和结束块。谢谢! (2认同)