PowerShell オブジェクト指向コマンドライン

PowerShellと従来のコマンドライン(CMDやBashなど)の最大の違いは、PowerShellのコマンド出力がオブジェクトであり、プレーンテキストではないことです。

PowerShellは従来のコマンドラインよりも柔軟で強力であり、スクリプト作成やシステム管理をより効率的にします。

「オブジェクト指向コマンドライン」とは

従来のコマンドラインでは、コマンド間はパイプを通じて|渡されるのは文字列テキストであり、これらのテキストをさらに処理するには、通常grep、awk、sedなどのツールを利用する必要があります。

一方PowerShellでは、コマンド間でパイプを通じて渡されるのはオブジェクトであり、オブジェクトのプロパティやメソッドに直接アクセスできるため、テキストを解析する必要がなく、正確性と開発効率が大幅に向上します。

コマンドの出力はオブジェクト

以 Get-Processコマンドを例にします:

Get-Process

このコマンドは、現在システムで実行中のプロセス一覧を取得するために使用します。

Get-Processコマンドが返すのはプレーンテキストの表ではなく、一連の.NETオブジェクトであり、各プロセスはSystem.Diagnostics.Process型のオブジェクトです。

プログラミング言語のオブジェクトにアクセスするように、そのプロパティにアクセスできます。例:

(Get-Process)[0].Name

上記のコマンドは最初のプロセスの名前を取得するもので、出力例:

explorer

オブジェクトの構造を確認する:Get-Member

オブジェクトを深く理解するには、どのようなプロパティとメソッドがあるかを把握することが重要です。PowerShellにはGet-Memberオブジェクトの構造を調べるのに役立つコマンドが用意されています:

Get-Process | Get-Member

出力例の一部:

Name        MemberType   Definition
----        ----------   ----------
Id          Property     int Id {get;}
Name        Property     string Name {get;}
Kill        Method       void Kill()
Start       Method       void Start()

説明:

  • Propertyオブジェクトのプロパティを表します。例:Id、Name
  • Methodオブジェクトのメソッドを表します。例:Kill()、Start()

これらのメンバーは、オブジェクト.プロパティ 或 オブジェクト.メソッド()の形式で使用できます。


オブジェクトのパイプライン受け渡し

パイプラインで渡されるのはオブジェクト

PowerShellでは、複数のコマンドが|で接続される場合、渡されるのはオブジェクトであり、テキストではありません。
つまり、後続のコマンドで前のコマンドから渡されたオブジェクトのプロパティに直接アクセスできます。

例:状態がRunningのサービスをすべてフィルタリングする:

Get-Service | Where-Object { $_.Status -eq 'Running' }

解説:

  • $_は現在のパイプライン内のオブジェクトを表します
  • Statusはサービスオブジェクトのプロパティです

パイプライン操作フローチャート(Mermaid)


よく使うオブジェクト処理コマンド

PowerShellには、オブジェクトを操作するための組み込みコマンドが多数用意されており、フィルタリング、並べ替え、グループ化、エクスポートなどの場面でよく使用されます:

コマンド 機能説明
Where-Object 条件に基づいてオブジェクトをフィルタリング
Select-Object オブジェクトのプロパティを選択または名前変更
Sort-Object 特定のプロパティに基づいてオブジェクトを並べ替え
Group-Object プロパティに基づいてオブジェクトをグループ化して集計
Measure-Object オブジェクトの数、合計、平均などを集計
Export-Csv オブジェクトをCSVファイルにエクスポート
ConvertTo-Json オブジェクトをJSON形式の文字列に変換

オブジェクトのプロパティ選択と計算列

特定のプロパティを選択

Get-Process | Select-Object Name, Id, CPU

このコマンドは、各プロセスの名前、ID、CPU使用状況を抽出します。

計算列(カスタムプロパティ)の追加

スクリプトブロックを使用してカスタムプロパティを追加できます:

Get-Process | Select-Object Name, @{Name="MemoryMB";Expression={$_.WorkingSet / 1MB -as [int]}}

説明:

  • @{}ハッシュテーブルを作成して新しいプロパティを定義します
  • Name新しい列名を指定します
  • Expression計算ロジックを提供します

並べ替えとグループ化操作

プロセスをCPU使用率で並べ替え

Get-Process | Sort-Object CPU -Descending

サービスの状態でグループ化

Get-Service | Group-Object Status

出力例:

Count Name                      Group
----- ----                      -----
   75 Running                   {WinDefend, WSearch, ...}
   35 Stopped                   {Fax, Spooler, ...}

エクスポートと構造化データ

CSVファイルにエクスポート

Get-Service | Select-Object Name, Status | Export-Csv -Path services.csv -NoTypeInformation

JSON形式に変換

Get-Service | ConvertTo-Json

これらの形式は他のシステムやAPIとの統合を容易にし、自動化ワークフローの重要な部分です。


典型的な実用例

例1:CPUを最も消費する上位5プロセスを検索

Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 Name, CPU

例2:サービス状態ごとに数を集計

Get-Service | Group-Object Status | Select-Object Name, Count

まとめとアドバイス

PowerShellのオブジェクト指向の特性により、コマンドライン操作はプログラミング設計の考え方により適合したものになります。オブジェクトのプロパティとメソッドを通じて、ユーザーはシステムリソースをより正確に操作し、より強力で信頼性の高い自動化スクリプトを構築できます。

初心者は以下の点から取り組んで基礎を固めることをお勧めします:

  1. を多用してGet-Memberオブジェクトの構造を調べましょう
  2. の使い方をWhere-ObjectとSelect-Objectしっかりマスターしましょう
  3. を使ってGroup-Object、Sort-Objectデータを処理してみましょう
  4. コマンドの結果をCSVまたはJSONファイルにエクスポートしてみましょう
その他の拡張