PowerShell パイピングは、あるコマンドレットの出力を取得し、それを別のコマンドレットに入力として渡すことで機能することを理解しています。しかし、これを行うにはどうすればよいでしょうか。
最初のコマンドレットが終了し、すべての出力変数が一度に渡され、次のコマンドレットによって処理されますか?
それとも、最初のコマンドレットからの各出力を一度に 1 つずつ取得してから、残りのパイプ処理されたすべてのコマンドレットを実行しますか?
PowerShell パイピングは、あるコマンドレットの出力を取得し、それを別のコマンドレットに入力として渡すことで機能することを理解しています。しかし、これを行うにはどうすればよいでしょうか。
最初のコマンドレットが終了し、すべての出力変数が一度に渡され、次のコマンドレットによって処理されますか?
それとも、最初のコマンドレットからの各出力を一度に 1 つずつ取得してから、残りのパイプ処理されたすべてのコマンドレットを実行しますか?
簡単なスクリプトを使用して、パイプラインの順序がどのように機能するかを確認できます。
function a {begin {Write-Host 'begin a'} process {Write-Host "process a: $_"; $_} end {Write-Host 'end a'}}
function b {begin {Write-Host 'begin b'} process {Write-Host "process b: $_"; $_} end {Write-Host 'end b'}}
function c { Write-Host 'c' }
1..3 | a | b | c
出力:
begin a
begin b
process a: 1
process b: 1
process a: 2
process b: 2
process a: 3
process b: 3
end a
end b
c
これまでの両方の回答から、パイプライン処理に関する有益な情報が得られます。しかし、言うべきことはまだあります。
まず、あなたの質問に直接答えるために、パイプラインが機能する可能性のある 2 つの方法を想定しました。そして、どちらも正しいです...パイプの両側のコマンドレットに応じて! ただし、パイプラインが機能する方法は、オブジェクトが一度に 1 つずつ処理されるという 2 番目の概念に近いものです。(ただし、S Nash が述べたように、パイプライン内の各コンポーネントは非同期であるため、オブジェクトが次のオブジェクトが開始される前に最後まで進むという保証はありません。)
では、「コマンドレットに依存する」とはどういう意味ですか? Microsoft が提供するコマンドレットについて話している場合、それらはすべて期待どおりに機能し、パイプラインを介して各オブジェクトを可能な限り効率的に渡します。ただし、作成するコマンドレットについて話している場合は、その作成方法によって異なります。適切なパイプライン処理を実行できないコマンドレットを作成するのは、成功するコマンドレットを作成するのと同じくらい簡単です!
2 つの主要な障害モードがあります。
もちろん、努力したいのは、各入力を受信したらすぐに処理し、決定したらすぐに出力を発行することです。これらすべての詳細な例については、Simple-Talk.com で公開されたばかりの私の記事Ins and Outs of the PowerShell Pipeline を参照してください。