3

PowerShellでは、パイプラインでのコマンドレットの実行順序が明確な方法で実行されていないようです。各コマンドレットを実行してからパイプライン内の次のコマンドレットに結果を渡すのではなく、コマンドレットの個々の出力オブジェクトが、前のコマンドレットの実行前に次のコマンドレットの入力に渡されるようです。以下は、この動作を確認します。

1..5 | %{ Write-Host $_; $_ } | %{ Write-Host ([char]($_ + 64)) }

プリント

1
A
2
B
3
C
4
D
5
E

何が起こっているのかというと、ForEach-Objectコマンドレットを実行するたびに、スクリプトブロックと、パイプライン内の後続の各コマンドが、繰り返される前に実行されるようです。

これは実際に発生することであり、この動作はどこかに文書化されていますか?ForEach-Objectこれは、 (たとえばWhere-Objectなど)のようなすべての反復コマンドレットに当てはまりますか?

式()でピースをラップする(1..5 | %{ Write-Host $_; $_ }) | %{ Write-Host ([char]($_ + 64)) }か、変数にピースを割り当ててから、この動作を回避するために後続のパイプラインコマンドにパイプすることができますが、コレクションの各要素に対して操作を実行して、それを渡す方法はありますか?コレクション全体をパイプラインの次のコマンドに移しますか?

4

2 に答える 2

4

これは、パイプラインがオブジェクトを処理する方法についての私の理解と一致しています。オブジェクトは、次のアイテムに触れる前に、パイプライン内を可能な限り「遠くまで」移動します。一部のコマンドレットは、"process" ブロックを使用せず、代わりに必要に応じて "end" ブロックを使用するため (たとえば、実際に並べ替えを実行するには、並べ替えオブジェクトにすべての項目が必要です)、パイプラインをブロックします。他の人は書き込み出力 (2 番目の $_ が暗黙的に行っている) を使用し、パイプラインを動かし続けます。

于 2012-07-27T19:36:22.757 に答える