入門編:オブジェクト指向パイプラインの基礎
テキストではなく構造化オブジェクトをそのまま次のコマンドへ受け渡す PowerShell 固有のパイプラインの仕組みと、主要なデータ処理コマンドレットを解説します。
オブジェクト指向パイプラインとは
パイプライン記号(|)を使用すると、左側のコマンドの実行結果を右側のコマンドへの入力として渡すことができます。
Unix 系シェルではパイプラインを通じて流れるデータは単なる「文字列(バイトストリーム)」です。そのため、特定の項目を取得するには grep や awk、sed などの外部ツールで文字列を解析する必要がありました。
PowerShell のパイプラインを流れるのは文字列ではなく、型情報とプロパティ(属性)を持った「.NET オブジェクト」です。文字列の解析処理を書く必要がなく、プロパティ名を指定するだけで安全にデータを取り出せます。
Get-Member によるオブジェクトの解析
パイプラインを流れるオブジェクトがどのような型であり、どのような情報(プロパティ)や操作(メソッド)を持っているかを調べるには Get-Member を利用します。
Get-Service | Get-Member
このコマンドを実行すると、出力されるオブジェクトの型(System.ServiceProcess.ServiceController など)や、利用可能なプロパティ一覧(Name、Status、DisplayName など)が確認できます。
データの絞り込み(Where-Object)
Where-Object コマンドレットは、パイプラインから渡されたオブジェクトの中から、指定した条件に合致するものだけを抽出します。
» スクリプトブロック構文
波括弧 {} の中に条件式を記述します。パイプラインを流れてくる各オブジェクトは $_(または $PSItem)という特殊変数で参照します。
# 実行中のサービスのみを抽出する
Get-Service | Where-Object { $_.Status -eq "Running" }
» 比較演算子
PowerShell の比較演算子は記号(< や >)ではなく、英字の短縮形を使用します。
| 演算子 | 意味 | 使用例 |
|---|---|---|
-eq | 等しい(Equal) | $_.Status -eq "Running" |
-ne | 等しくない(Not Equal) | $_.Id -ne 0 |
-gt | より大きい(Greater Than) | $_.CPU -gt 10 |
-ge | 以上(Greater or Equal) | $_.Length -ge 1MB |
-lt | より小さい(Less Than) | $_.Count -lt 5 |
-le | 以下(Less or Equal) | $_.Count -le 10 |
-like | ワイルドカード一致 | $_.Name -like "Power*" |
-match | 正規表現一致 | $_.Version -match "^7\." |
» 簡略構文
単純な比較の場合、波括弧や $_ を省略して直感的に記述できます。
Get-Service | Where-Object Status -eq "Running"
プロパティの抽出と計算(Select-Object)
Select-Object は、オブジェクトから特定のプロパティを取り出したり、件数を制限したりする際に使用します。
» 特定のプロパティの抽出
不要な情報を省き、必要な列だけを画面に表示したり次の処理に渡したりできます。
Get-Process | Select-Object -Property Name, Id, CPU
» 件数の制御
-First や -Last パラメータを使うと、先頭や末尾の指定件数のみを取得できます。
# 先頭の5件のみ取得する
Get-Process | Select-Object -First 5
» 計算プロパティ(カスタム列の作成)
ハッシュテーブル構文 @{ Name = "..."; Expression = { ... } } を用いて、既存の値を加工した新しい列を動的に定義できます。
# メモリ使用量(バイト)をメガバイト単位(MB)に換算して表示する
Get-Process | Select-Object -Property Name, @{
Name = "MemoryMB"
Expression = { [math]::Round($_.WorkingSet64 / 1MB, 2) }
}
データの並べ替えとグループ化
取得したオブジェクトの並べ替えや集計を行うコマンドレットについて説明します。
» Sort-Object(並べ替え)
指定したプロパティを基準にオブジェクトを昇順または降順で整列させます。
# CPU使用率の高い順(降順)に上位10プロセスを表示する
Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 10
» Group-Object(グループ化)
共通の値を持つオブジェクトごとにグループ化し、グループごとの件数や内訳を集計します。
# サービスを稼働状態(Status)ごとにグループ化して集計する
Get-Service | Group-Object -Property Status