【PowerShell】パイプラインとは

※この記事は「2021年4月23日」に更新しました。

今回は、PowerShell(パワーシェル)のパイプラインについて。

PowerShell は、オブジェクトを扱うということを以前の記事で紹介しました。

パイプ処理(パイプライン)についても同様で、オブジェクトを受け渡しすることになります。

SE、Web制作、販売を経験した管理人が解説します。

環境は、Windows 10(64bit)、PowerShell 5.11 です。

パイプラインとは

パイプラインとは、複数のコマンドレットで実行結果を受け渡すときに使うものです。

例えば、3つのコマンドレットをパイプ処理でつなげるには以下のように書きます。

コマンドレット1 | コマンドレット2 | コマンドレット3

パイプラインは、別に PowerShell だけが使えるわけではありません。

コマンドプロンプトでも、使うことができます。

しかし、コマンドプロンプトと PowerShell では、パイプラインの挙動が異なります。

コマンドプロンプトの場合、受け取った入力は StdIn(標準入力)に送り、無事処理が実行されれば StdOut(標準出力)に出力されます。

もし、エラーが発生した場合は、StdErr(標準エラー)に出力されます。

コマンドプロンプトの場合、StdOut と StdIn をつなぐのが、パイプラインでした。

しかし、PowerShell の場合、このような動きはしません。

PowerShell は、出力をオブジェクトとして、パイプラインに送ります。

オブジェクトの入力に関しては、どのパラメータに対してつなげればよいか判断する必要があります。

実際に使って慣れる必要がありますが、使いこなすと PowerShell のパイプラインは非常に強力です。

他のシェルと決定的に違うところなのでガンガン使っていきましょう。



パイプラインの例

それでは、実際にパイプラインを使った例を紹介していきます。

Select-Object を使った例

Select-Object は、パイプラインで受け取ったオブジェクトから必要なデータを抽出するコマンドレットです。

Get-Variable | Select-Object Name

Get-Variable は、現在定義されている変数一覧を確認できるコマンドレットです。

この実行結果に対して、パイプラインを使って、Select-Object でデータを抽出します。

Name という項目だけ表示させます。

実行結果は、以下の通りです。

Select-Object を使った例

長すぎるので途中で画像は切っていますが、まだ下に続いています。

Where-Object を使った例

Where-Object は、パイプラインで受け取ったオブジェクトから指定した条件を満たすデータを抽出するコマンドレットです。

Get-Variable | Where-Object Name -like O*

先程と同じく Get-Variable を使っていきます。

Where-Object の条件は、Name で O から始まるデータだけ抽出しています。

ちなみに、下記のように表現することもできます。

Get-Variable | Where-Object { $_.Name -like "O*" }

$_ というのは自動変数で、中括弧で囲まれているのはスクリプトブロックと呼ばれるものです。

実行結果は以下の通りです。

Where-Object を使った例

ForEach-Object を使った例

ForEach-Object は、個々のオブジェクトに対して任意の処理を行うことができるコマンドレットです。

簡単にどんなことができるか紹介します。

適当に、以下のような配列をつくります。

$a = 1, 2, 3

パイプラインを使って、この配列を ForEach-Object に渡してみましょう。

$a | ForEach-Object {2 * $_ + 1}

実行結果は、以下の通りです。

ForEach-Object を使った例

最後に

いかがでしょうか。

今回は、PowerShell(パワーシェル)のパイプラインについて紹介しました。

オブジェクトをパイプラインで受け渡すことに慣れていけば、今までバッチ(スクリプト)を作成していたのが、コマンドだけで解決することもあります。

とにかく慣れていきましょう。