2011-07-03 9 views
4

Get-ChildItemが何百万というアイテムを返すとします。 PowerShellはこれをどのように処理しますか?データをバッチで処理することはできますか?データが取得されるまで、コマンドはコンソールをブロックしますか?PowerShellは大きなデータセットをどのように扱いますか?

PowerShellを初めて使用したので、多くのアイテムを返す操作の処理の基本原則について説明することができます。完了までに時間がかかる場合があります。

答えて

6

Powershellコマンドレットは、一度に1レコードずつデータを処理します。 get-childitemの出力をスクリプトブロックまたは別のコマンドレットにパイプすると、両方とも同時に実行する必要があります。つまり、スクリプトブロックはレコードが利用可能になるとすぐに実行され、get-childitemはレコードを引き続き取得します。もちろん、コンソールアプリケーションであるため、レコードの処理中にさらにデータを要求するか、ユーザーがコマンドを終了しない限り、コンソールはすべてのレコードが処理されるまでブロックされます。時間/リソースを大量に処理する場合は、コマンドレットでバックグラウンドジョブを使用することを検討することをお勧めします(this msdn articleを参照)。

+1

技術的には、ProcessRecordメソッドでレコードを独自のデータ構造に蓄積し、EndProcessingメソッドで出力を処理/生成することで、レコードをバッチとして処理することもできます。しかし、これを行う理由はたくさんありませんが、追加のメモリ要件を回避し、固有の並列性を利用するために、レコードをストリームとして処理する方が常に優れています。 –

+1

これは良い答えです。コマンドレット内のBegin、Process、およびEndステートメントも同様に考えるようになりました。最初のレコードが処理される前に開始が1回起こり、各レコードに対してプロセスが繰り返され、最後が実行されます。 この質問にはあまり関係はありませんが、カスタムコマンドレットで大量のデータを処理するかどうかは分かりません。 (スペルミスのお詫び!) – Matt