结束管道操作

时间:2012-10-31 10:47:53

标签: powershell pipeline

在过滤器中有没有办法结束管道操作?

一个很好的用法是获取列表的前n个元素,类似于SQL的TOP语句。如果我们写了一个过滤器,称之为“Top”,我们就可以检索前3个元素:

dir | Top 3

一旦我们返回前三个,我们不需要再处理任何元素,实际上我们希望能够告诉管道

  

请不要再给我任何元素

我知道Select-Object有-First参数,但这不是我要问的问题。

我已经回答了问题Powershell equivalent to F# Seq.forall,但我宁愿将其作为结束管道输入的过滤器来实现。如果有一个名为“end-pipeline”的操作,我会将ForAll实现为:

filter ForAll([scriptblock] $predicate) {
    process {
        if ( @($_ | Where-Object $predicate).Length -eq 0 ) {
            $false;
            end-pipeline;
        }
    }
    end {
        $true;
    }
}

2 个答案:

答案 0 :(得分:2)

你可以使用“break”语句,它将表现为你的“end-pipeline”cmdlet

答案 1 :(得分:1)

如果达到条件,也许你可以添加return

查看here以获取一些示例

这可能有效:

filter ForAll([scriptblock] $predicate)
{
  process
         {        
            if ( @($input | Where-Object $predicate).length -eq 0 ) 
              {        
                 $false
                 return;
              }
         }
  end    
         {
            $true
         }
}

这有效:

filter aaa {    
process 
{      
  if ( ++$i -gt 5 )
  {
      return
  }
  else
  {
      $_
  }
}
}

dir | aaa # return first five element of the pipe...