1

フィルターにいる間にパイプ操作を終了する方法はありますか?

SQL の TOP ステートメントと同様に、リストの最初の n 個の要素を取得するのに適しています。"Top" という名前のフィルターを作成した場合、次のように最初の 3 つの要素を取得できます。

dir | Top 3

最初の 3 つを返したら、それ以上要素を処理する必要はありません。実際には、パイプに伝えることができるようにする必要があります。

これ以上要素を与えないでください

Select-Object に -First 引数があることは知っていますが、それは私が求めている質問ではありません。

F# Seq.forall と同等の Powershellという質問に答えましたが、代わりに、パイプライン入力を終了するフィルターとして実装したいと思います。「パイプラインの終了」と呼ばれる操作があった場合、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」コマンドレットとして動作します

于 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 に答える