在过滤器中有没有办法结束管道操作?
一个很好的用法是获取列表的前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;
}
}
答案 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...