1

当您在过滤器中时,有什么方法可以结束管道操作?

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

dir | Top 3

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

请不要再给我任何元素

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

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

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

2 回答 2

2

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

于 2012-10-31T11:06:32.983 回答
1

return如果条件满足,也许你可以添加一个。

这里的一些例子

这可能有效:

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...
于 2012-10-31T10:56:41.727 回答