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