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)) }
か、変数にピースを割り当ててから、この動作を回避するために後続のパイプラインコマンドにパイプすることができますが、コレクションの各要素に対して操作を実行して、それを渡す方法はありますか?コレクション全体をパイプラインの次のコマンドに移しますか?