Lesson 9

パイプライン

Lesson 9 Chapter 1
パイプライン

PowerShellのパイプラインとは、複数のコマンドをつないで、1つのコマンドが出力した結果を次のコマンドの入力として利用する方法です。これによって、複数のコマンドを短くまとめて実行することができます。

例えば、ファイル一覧を取得して、そのうち条件に合致するファイルだけを取り出したい場合には、Get-ChildItemコマンドでファイル一覧を取得し、Where-Objectコマンドレットで条件に合致するファイルだけをフィルタリングすることができます。

Lesson 9 Chapter 2
パイプラインの用途

パイプラインを使用することで、異なるコマンドを繋ぎ合わせて処理を連続して実行することができ、コマンドの出力を直接次のコマンドの入力として使用することができます。これにより、複数のコマンドを個別に実行する必要がなく、簡単に複数の処理を行うことができます。

パイプラインの主な用途には、以下のようなものがあります:

  • データのフィルタリングや選択

    パイプラインを使用することで、複数のコマンドレットを組み合わせて、必要な情報だけを抽出することができます。

  • 出力の整形

    パイプラインを使用することで、出力を特定の形式に整形したり、必要な情報だけを抜き出したりすることができます。

  • コマンドのチェーン

    パイプラインを使用することで、複数のコマンドを繋げて一連の処理を実行することができます。これにより、複雑なタスクを簡単に実行することができます。

  • データの集計や処理

    パイプラインを使用することで、複数のデータを集計して処理することができます。たとえば、ファイル内の特定の文字列の出現回数を数えるなどの処理ができます。

これらのような用途を活用することで、PowerShellのパイプラインを効果的に使用することができます。

標準入力

「標準入力」とは、コマンドラインから入力されたデータのことを指します。PowerShellでは、標準入力のデータをパイプラインで扱うことができます。

たとえば、以下のようなコマンドを考えてみましょう。

powershell
Get-Content file.txt | Select-String "keyword"

このコマンドは、file.txtというファイルからデータを読み込み、Select-Stringコマンドレットを使って、特定のキーワードを含む行を抽出しています。Get-Contentコマンドレットが標準入力からデータを読み込み、パイプラインでSelect-Stringコマンドレットに渡しています。

このように、標準入力を使うことで、外部からのデータをパイプラインで扱うことができます。また、コマンドライン引数を使うこともできますが、複雑なデータを扱う場合には、標準入力を使った方が柔軟性が高くなります。

出力結果を整形する

このチャプターではパイプラインを使用してPowerShellの出力結果を整形する方法について説明します。

例えば、Get-Processコマンドレットを実行すると、現在実行中のすべてのプロセスがリストされます。しかし、この出力は一覧表の形式ではなく、データが多すぎて読みづらい場合があります。

この場合、パイプラインでSelect-Objectコマンドレットを使用することで、表示するプロセスのプロパティを指定することができます。例えば、次のコマンドを使用して、プロセス名、ID、およびメモリ使用量のみを表示できます。

powershell
Get-Process | Select-Object Name,Id,WorkingSet

これにより、より見やすいテーブル形式の出力が得られます。同様に、Sort-Objectコマンド(Lesson9 Chapter3で後述)を使用してプロセスを特定のプロパティに基づいて並べ替えることもできます。

また、Format-Tableコマンドレットを使用して、テーブル形式の出力をカスタマイズすることもできます。例えば、次のコマンドを使用して、プロセス名、ID、およびメモリ使用量のみを表示し、名前を "Process Name"、IDを "PID"、およびメモリ使用量を "Memory"に変更できます。

powershell
Get-Process 
| Select-Object Name,Id,WorkingSet 
| Format-Table @{Label="Process Name";Expression={$_.Name}}, @{Label="PID";Expression={$_.Id}}, @{Label="Memory";Expression={$_.WorkingSet/1MB}}

このコマンドでは、カスタムのラベルと式を使用して、プロセス名、ID、およびメモリ使用量を表形式で表示しています。

ファイル出力する

PowerShellのパイプラインを利用して、コマンドの出力をファイルに保存することができます。

例えば、現在のディレクトリにあるテキストファイルの一覧を取得し、その一覧をファイルに保存したいとします。以下のようにコマンドを入力します。

powershell
Get-ChildItem | Out-File -FilePath fileList.txt

この例では、Get-ChildItemコマンドレットで現在のディレクトリ内のファイル一覧を取得し、Out-Fileコマンドレットでファイルに出力しています。-FilePathパラメーターを使用して、出力するファイルの名前と場所を指定します。

このコマンドを実行すると、fileList.txtという名前のファイルが現在のディレクトリに作成され、ファイル一覧がその中に書き込まれます。このように、パイプラインを使用してコマンドの出力をファイルに保存することができます。

Lesson 9 Chapter 3
パイプラインを使ったオブジェクト操作

パイプラインを使ったオブジェクト操作とは、PowerShellのコマンドレットをパイプラインで繋ぎ、複数のコマンドレットを組み合わせて、オブジェクトを操作することを指します。

通常、PowerShellでは、コマンドレットに渡す入力オブジェクトをパイプラインで渡すことができます。そして、出力されたオブジェクトを、次のコマンドレットの入力オブジェクトとして使うことができます。このように、パイプラインを使って複数のコマンドレットを繋げることで、簡単に複雑な操作を行うことができます。

例えば、ファイルからテキストを読み取り、パイプラインで文字列操作コマンドレットを繋いで、文字列の検索や置換、分割、連結などを行うことができます。また、ファイルからデータを読み取り、パイプラインでデータ操作コマンドレットを繋いで、データの整形や集計、フィルタリング、グルーピングなどを行うこともできます。

このように、パイプラインを使ったオブジェクト操作は、PowerShellの強力な機能の一つであり、PowerShellを使いこなす上で重要な概念の一つとなります。

Foreach-Object

「Foreach-Object」とは、パイプラインを使ってオブジェクトのリストを繰り返し処理するためのコマンドレットです。 具体的には、パイプラインで受け取ったオブジェクトを1つずつ順番に処理し、スクリプトブロック内に指定した処理を実行します。スクリプトブロック内では、現在処理中のオブジェクトに対して自由に操作を行うことができます。

例えば、以下のコマンドを考えてみましょう。

powershell
Get-ChildItem | Foreach-Object { $.Name }

このコマンドは、現在のディレクトリにあるファイルやフォルダの一覧を取得し、各ファイルやフォルダの名前を表示します。最初に、Get-ChildItem コマンドレットがファイルやフォルダの一覧を取得し、パイプラインを通じて Foreach-Object コマンドレットに渡されます。そして、Foreach-Object コマンドレットは、パイプラインで受け取ったオブジェクト(ファイルやフォルダ)を1つずつ順番に処理し、スクリプトブロック { $.Name } を実行します。このスクリプトブロック内では、$_変数を使って現在処理中のオブジェクトにアクセスし、その名前を表示するために Name プロパティを参照しています。

Foreach-Object コマンドレットを使うことで、パイプラインで受け取ったオブジェクトを簡単に処理することができます。スクリプトブロック内で行う処理は自由度が高く、オブジェクトの操作を柔軟に行うことができます。

Where-Object

「Where-Object」は、オブジェクトの中から特定の条件に合うものだけを選択するために使われるコマンドレットです。条件は、フィルタリングしたいプロパティやメソッドを指定します。

例えば、サイズが1GB未満のファイルだけを選択したい場合は、以下のように記述します。

powershell
Get-ChildItem | Where-Object {$_.Length -lt 1GB}

この例では、「Get-ChildItem」コマンドレットで現在のディレクトリのファイル一覧を取得し、パイプラインを介して「Where-Object」に渡します。条件式 {$_.Length -lt 1GB} は、現在のオブジェクトのサイズが1GB未満である場合にTrueを返します。その結果、サイズが1GB未満のファイルだけが選択され、出力されます。

このように、「Where-Object」を使用することで、条件に合うオブジェクトだけを選択して、必要な情報を簡単に取得することができます。

Select-Object

「Select-Object」とは、パイプラインで渡されたオブジェクトから特定のプロパティを抽出するためのPowerShellのコマンドレットです。

例えば、あるディレクトリ内にあるファイルの名前とサイズを抽出する場合、以下のように「Get-ChildItem」コマンドレットを使用してディレクトリ内のファイル一覧を取得し、「Select-Object」コマンドレットを使用してファイル名とサイズのプロパティのみを取り出すことができます。

powershell
Get-ChildItem -Path C:\mydir | Select-Object Name, Length

このコマンドでは、まず「Get-ChildItem」コマンドレットによって指定されたパスのディレクトリ内のファイル一覧を取得し、それらのオブジェクトがパイプラインに渡されます。次に、「Select-Object」コマンドレットによって、渡されたオブジェクトから「Name」と「Length」プロパティのみを取り出し、それがパイプラインから出力されます。

このように、「Select-Object」コマンドレットを使用することで、必要なプロパティのみを選択して出力することができます。また、「Select-Object」コマンドレットでは、プロパティ名のエイリアスを定義することもできます。たとえば、上記の例では「Length」というプロパティ名を使用していますが、「Size」というエイリアスを定義して以下のように使用することもできます。

powershell
Get-ChildItem -Path C:\mydir | Select-Object Name, @{Name="Size"; Expression={$_.Length}}

このコマンドでは、計算されたプロパティを含むハッシュテーブルが定義され、それを使用して「Size」というエイリアスを定義しています。ここでは、ファイルのサイズをバイト単位で取得するために、渡されたオブジェクトの「Length」プロパティを使用しています。

ハッシュテーブル

ハッシュテーブルとは、データを保存するためのデータ構造の一種で、データを検索する速度を高めることができます。データのキーをハッシュ関数によって数値に変換し、その数値を配列のインデックスとして使用することで、データを高速に取り出すことができます。例えば、電話帳のようなものと考えるとイメージしやすいでしょう。

Group-Object

「Group-Object」は、PowerShellのコマンドレットの1つで、オブジェクトのプロパティ値に基づいてオブジェクトをグループ化することができます。

たとえば、以下のようなCSVファイルがあるとします。

csv
Name, Age, Gender
John, 24, Male
Mary, 30, Female
Bob, 29, Male
Emily, 27, Female

このCSVファイルをImport-Csvコマンドレットを使って読み込んだ上で、Group-Objectコマンドレットを使って「Gender」プロパティの値に基づいてグループ化するには、次のようにします。

powershell
Import-Csv -Path C:\example.csv | Group-Object Gender

これにより、MaleとFemaleの2つのグループが作成されます。各グループには、それぞれ「Name」「Age」「Gender」のプロパティを持つオブジェクトのリストが含まれています。

Group-Objectコマンドレットは、オブジェクトをグループ化するためのコマンドです。-Propertyパラメータを使用することで、どのプロパティでグループ化するかを指定することができます。-NoElementを使用すると、グループごとにオブジェクトの数をカウントするのではなく、グループ名とオブジェクトのリストのみを返すことができます。例えば、ファイルの種類ごとにグループ化したい場合に便利です。

このように、Group-Objectコマンドレットを使うことで、大量のオブジェクトを効率的にグループ化して、より分かりやすい形で情報を整理することができます。

Sort-Object

「Sort-Object」とは、パイプラインを使ってオブジェクトの並び替えを行うPowerShellのコマンドレットです。このコマンドレットを使用することで、オブジェクトを指定されたプロパティに基づいて昇順または降順にソートすることができます。

例えば、以下のように「Sort-Object」コマンドレットを使用することで、名前で昇順にソートすることができます。

powershell
Get-ChildItem | Sort-Object Name

また、複数のプロパティを指定してソートすることもできます。以下の例では、フォルダ内のファイルを拡張子でソートし、同じ拡張子内では名前順にソートしています。

powershell
Get-ChildItem | Sort-Object Extension, Name

このように、「Sort-Object」コマンドレットを使用することで、複数のプロパティを指定したソートや、昇順/降順の並び替えが簡単に行えます。

並び替えの順序を指定するには、以下のようにオプションを使用します。

  • 昇順の場合は「-Ascending」または「-A」を指定します。
  • 降順の場合は「-Descending」または「-D」を指定します。

例えば、フォルダ内のファイルをサイズの大きい順に降順で並び替える場合は、以下のようにコードを記述します。

powershell
Get-ChildItem | Sort-Object Length -Descending

このように、先にソートしたいプロパティを指定し、「-Ascending」または「-Descending」オプションで並び替えの順序を指定します。

Compare-Object

「Compare-Object」とは、2つのオブジェクト集合を比較し、差分を出力するPowerShellのコマンドレットです。

「Compare-Object」は、パイプラインを使って2つのオブジェクト集合を入力として受け取り、差分を出力します。このコマンドレットは、2つのオブジェクト集合の要素の比較を行い、異なる要素を見つけることができます。

以下は、「Compare-Object」の基本的な使い方です。

powershell
Compare-Object -ReferenceObject $object1 -DifferenceObject $object2

この例では、2つのオブジェクト集合である「$object1」と「$object2」を比較しています。差分を出力するために、出力されるオブジェクトには「InputObject」、「SideIndicator」、および「InputObjectTypeName」という3つのプロパティがあります。

「InputObject」は、差分が見つかったオブジェクト自体を表します。 「SideIndicator」は、それがどちらのオブジェクトに存在するかを示します。差分が見つからない場合は、何も出力されません。 「InputObjectTypeName」は、オブジェクトの型を示します。

例えば他にも、「Compare-Object」を使用すると、2つのフォルダ内のファイルの差分を見つけることができます。次の例では、2つのフォルダ「Folder1」と「Folder2」を比較しています。

powershell
Compare-Object -ReferenceObject (Get-ChildItem -Path C:\Folder1) -DifferenceObject (Get-ChildItem -Path C:\Folder2)

このコマンドでは、「Get-ChildItem」コマンドレットを使って、「C:\Folder1」と「C:\Folder2」のファイル一覧を取得しています。それぞれの結果を「ReferenceObject」と「DifferenceObject」に渡し、差分を見つけます。出力には、2つのフォルダに存在する異なるファイルが表示されます。

「Compare-Object」は、PowerShellで差分を見つけるために非常に便利なコマンドレットです。2つのオブジェクト集合を比較する必要がある場合には、このコマンドを使うことができます。