はじめに
PowerShell を使っていて、次のように感じたことはありませんか?
- パイプ(
|)はあるけど、Bash と何が違うのか分からない -
Where-ObjectやSelect-Objectが直感的でない - なぜ PowerShell は「自動化に強い」と言われるのか
これらの疑問はすべて、**「オブジェクトとパイプライン」**を理解すると一気に解消します。
本記事では、PowerShell の設計思想の中核である
オブジェクト指向パイプラインを、概念から実例まで丁寧に解説します。
パイプラインの正体:テキストではない
まず、PowerShell と従来の Shell の決定的な違いを整理します。
従来の Shell(CMD / Bash)
- パイプで流れるもの:文字列
- 出力は人間向け
- 次のコマンドは文字列を再解析する
ps aux | grep root
見た目は便利だが、構造を持たない
PowerShell のパイプライン
- パイプで流れるもの:オブジェクト
- 型・プロパティ・メソッドを保持
- 再解析が不要
Get-Process | Where-Object CPU -gt 100
👉 「CPU プロパティが 100 を超えるプロセス」を
👉 意味で処理している
オブジェクトとは何か(PowerShell 視点)
PowerShell では、すべての出力はオブジェクトです。
例:
$p = Get-Process
$p の中身は:
- 文字列の集合ではない
- Process オブジェクトの配列
オブジェクトの中身を覗く
Get-Process | Get-Member
出力には:
- プロパティ(Name, Id, CPU, Path…)
- メソッド(Kill(), CloseMainWindow() など)
👉 PowerShell は CLI でありながら API を触っている感覚に近い
Select-Object:必要な情報だけを抜き出す
Get-Process | Select-Object Name, CPU
- 表示を整えているだけではない
- オブジェクトの形を作り直している
そのため後続処理にも使えます。
Where-Object:条件で意味的に絞る
Get-LocalUser | Where-Object PasswordRequired -eq $false
これは:
- テキスト検索ではなく
- Boolean プロパティによる条件判定
👉 PowerShell が管理業務に強い理由の一つです。
Sort / Measure:集計が自然に書ける
ソート
Get-Process | Sort-Object CPU -Descending
集計
Get-LocalUser | Measure-Object
👉 数えるために wc や正規表現は不要
なぜ PowerShell は自動化に向いているのか
理由は明確です。
- 入力:構造化オブジェクト
- 処理:意味に基づく条件
- 出力:再利用可能なオブジェクト
(Get-NetTCPConnection -State Listen).Count
👉 1 行で 取得 → 条件 → 集計 が完結
パイプライン設計の基本ルール
PowerShell では、次の考え方が重要です。
- 取得(Get-)
- 加工(Where / Select / Sort)
- 集計・出力(Measure / Export)
例:
Get-ChildItem C:\Users -Recurse |
Where-Object Length -gt 10MB |
Select Name, Length
セキュリティ視点で見るオブジェクトパイプライン
PowerShell が攻防両面で注目される理由もここにあります。
- 攻撃者:
→ 既存 API を静かに操作できる - 防御側:
→ オブジェクト操作をログとして検知できる
👉 便利さ = 可観測性でもある
まとめ
- PowerShell の本質は オブジェクト
- パイプラインは オブジェクトの流れ
- フィルタ・集計が自然に書ける
- 自動化・管理に最適化された設計