Powershell 结束管道作业

Powershell 结束管道作业,powershell,pipeline,Powershell,Pipeline,当您在过滤器中时,是否有任何方法可以结束管道操作 一个很好的用法是获取列表的前n个元素,类似于SQL的TOP语句。如果我们编写一个过滤器,称之为“Top”,我们可以检索前3个元素,如下所示: dir | Top 3 一旦我们返回了前三个元素,我们就不需要处理更多的元素,实际上我们希望能够告诉管道 请不要给我更多的元素 我知道Select对象有第一个参数,但这不是我要问的问题 我已经回答了这个问题,但我更愿意将其实现为一个过滤器,用于结束管道输入。如果有一个名为“end pipeline”的操作

当您在过滤器中时,是否有任何方法可以结束管道操作

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

dir | Top 3
一旦我们返回了前三个元素,我们就不需要处理更多的元素,实际上我们希望能够告诉管道

请不要给我更多的元素

我知道Select对象有第一个参数,但这不是我要问的问题

我已经回答了这个问题,但我更愿意将其实现为一个过滤器,用于结束管道输入。如果有一个名为“end pipeline”的操作,我会将ForAll实现为:

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

如果达到条件,您可能可以添加一个
返回

寻找一些例子

这可能有效:

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...

您可以使用“break”语句,它的行为将与您的“end pipeline”cmdlet一样

感谢您提供的链接-我将检查它。我尝试返回-它从进程块而不是筛选器中返回。这仍然会为每个元素执行进程块。。。我想停止处理。按照杰基的建议,使用“break;”可以做到这一点。它很有效。然而,Christian提供的连接对于终止管道来说意义重大。“break”语句在所有情况下都可以安全使用吗?一般来说,它是安全的,但如果调用包含break的脚本文件,而该脚本文件不在while、for等循环中,则可能会中断整个脚本的执行。@TahirHassan-
break
将阻止脚本的其余部分执行。Try:
0..9 |.{process{if($Ult-5){$}else{break;}}}}度量;写“结束”
。请注意,在该示例中,
measure
不会返回任何内容,“end”也不会被打印出来。您可以将整个管道包装在一个
try..catch
中,但管道末尾的measure命令仍然不起作用。我一直在试图找到解决这个问题的好办法,但还没有找到;请看我的问题!如果在管道中使用
break
,而管道又在某个循环中,那么管道将停止,但循环也会停止!