【问题标题】:Ending a Pipe Operation结束管道操作
【发布时间】:2012-11-01 02:12:48
【问题描述】:

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

一个很好的用途是获取列表的前 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;
    }
}

【问题讨论】:

    标签: powershell pipeline


    【解决方案1】:

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

    【讨论】:

    • 它有效。然而,Christian 提供的链接powershell.com/cs/blogs/tobias/archive/2010/01/01/… 对结束管道很重要。 “break”语句在所有情况下都可以安全使用吗?
    • 一般来说,它是安全的,但是如果你调用一个包含不在某些循环(如 while、for 等)中的 break 的脚本文件,它可能会中断整个脚本的执行。
    • @TahirHassan - break 将阻止脚本的其余部分执行。试试:0..9 | .{process{if($_ -lt 5){$_} else{break;}}}| measure; write 'end'。请注意,在该示例中,measure 不会返回任何内容,并且不会打印“end”。您可以将整个管道包装在 try..catch 中,但管道末尾的测量命令仍然不起作用。我一直在尝试找到解决此问题的好方法,但还没有;在stackoverflow.com/q/8749206/291709查看我的问题
    • 注意!如果你在管道中使用break,而管道又在某个循环中,那么管道将停止,但循环也会停止!
    【解决方案2】:

    如果满足条件,也许您可​​以添加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...
    

    【讨论】:

    • 感谢您的链接 - 我会检查一下。
    • 我试过 return - 它从进程块中返回,而不是从过滤器中返回。
    • 这仍然为每个元素执行进程块...我希望停止处理。使用“中断;”正如杰基建议的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2021-01-26
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    相关资源
    最近更新 更多