PowerShellを利用してシステム管理やデータ分析を行う際、取得した情報を整理して表示することは非常に重要なステップです。
大量のオブジェクトの中から必要なデータを見つけ出すためには、特定の条件に基づいてデータを整列させる「並び替え」の操作が欠かせません。
Windows PowerShellから最新のPowerShell 7系に至るまで、データの並び替えを担う中心的なコマンドレットがSort-Objectです。
本記事では、Sort-Objectの基本的な使い方から、実務で役立つ複数条件による並び替え、さらには計算式を用いた高度なテクニックまでを詳しく解説します。
2026年現在のシステム運用においても、このコマンドを使いこなすことは業務効率化の鍵となりますので、ぜひ最後までご覧ください。
Sort-Objectの基本概念と構文
PowerShellの最大の特徴は、テキストではなく「オブジェクト」をパイプラインで受け渡す点にあります。
Sort-Objectコマンドレットは、パイプラインから渡されたオブジェクトを受け取り、指定されたプロパティの値に基づいてそれらを並べ替えます。
基本的な構文は非常にシンプルで、並び替えたいプロパティ名を指定するだけです。
例えば、プロセスのリストを取得して、メモリ使用量(WorkingSet)の順に並び替えたい場合は次のように記述します。
# プロセスを取得し、メモリ使用量(WS)で昇順に並び替える
Get-Process | Sort-Object -Property WS
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
150 10 2100 4500 0.02 1234 1 svchost
...
デフォルトでは昇順(小さい順)で並び替えが行われます。
-Propertyパラメータは位置パラメータであるため、通常は省略して記述されることが一般的です。
主要なパラメータの一覧
Sort-Objectには、並び替えの動作を制御するための便利なパラメータがいくつか用意されています。
主要なものを以下の表にまとめました。
| パラメータ名 | 説明 |
|---|---|
-Property | 並べ替えの基準となる1つ以上のプロパティを指定します。 |
-Descending | 降順(大きい順)で並べ替えます。 |
-Unique | 並べ替えた後、重複するオブジェクトを除去して一意なものだけを返します。 |
-CaseSensitive | 文字列の比較において大文字と小文字を区別します。 |
-Stable | 並べ替えキーが同じ場合、元の順序を維持します。 |
-Culture | 特定の言語規則(カルチャ)に基づいて並べ替えを行います。 |
降順での並び替え(Descending)
数値を扱う際や、最新の更新日時を上に表示したい場合には、降順でのソートが必要になります。
降順にするには、-Descendingスイッチを追加します。
以下の例では、ファイルの一覧をサイズが大きい順に表示します。
# ファイルを取得し、サイズ(Length)の大きい順に並び替える
Get-ChildItem | Sort-Object -Property Length -Descending
このコマンドを実行すると、ディスク容量を圧迫している大きなファイルを即座に特定できるようになります。
運用管理において、ログファイルの肥大化をチェックする際などに非常に重宝するテクニックです。
複数条件による並び替え
実務では「まずはステータスで分け、その中で名前順に並べたい」といった、複数の基準によるソートが求められる場面が多々あります。
Sort-Objectでは、-Propertyパラメータにカンマ区切りで複数のプロパティ名を指定することで、これを実現できます。
# サービスのリストを取得し、Status(状態)で並び替えた後、Name(名前)で並び替える
Get-Service | Sort-Object -Property Status, Name
この場合、第一条件である Status が優先され、同じステータスのオブジェクト同士の中で Name による並び替えが行われます。
昇順と降順を混在させる方法
「第1条件は昇順だが、第2条件は降順にしたい」という複雑なケースにも対応可能です。
このような場合は、ハッシュテーブルを使用して個別にプロパティ名と順序を指定します。
# Statusは昇順(Ascending)、名前(Name)は降順(Descending)で並び替える
Get-Service | Sort-Object -Property @{Expression="Status"; Descending=$false}, @{Expression="Name"; Descending=$true}
ハッシュテーブル内の Expression にプロパティ名を、Descending に $true または $false を指定します。
この記法をマスターすれば、あらゆるデータの整列ニーズに対応することが可能です。
計算式(スクリプトブロック)を用いた並び替え
Sort-Objectの真の柔軟性は、既存のプロパティだけでなく、その場で計算した値(動的な値)を基準にできる点にあります。
これを「計算されたプロパティ」または「スクリプトブロック」と呼びます。
例えば、ファイル名そのものではなく、「ファイル名の長さ」で並び替えたい場合は次のように記述します。
# ファイル名の文字数で並び替える
Get-ChildItem | Sort-Object -Property { $_.Name.Length }
{ } で囲まれたスクリプトブロック内では、$_ を使って現在のオブジェクトを参照できます。
他にも、「日付の『月』だけでソートする」といった抽出処理も可能です。
# 更新日時の「月」だけを見て並び替える
Get-ChildItem | Sort-Object -Property { $_.LastWriteTime.Month }
このように、オブジェクトが持つ生のデータだけでなく、加工した結果をソートキーにできるのはPowerShellの強力なメリットです。
重複データの除外(Unique)
データセットの中から一意の値だけを抽出したい場合には、-Uniqueパラメータが役立ちます。
このパラメータを使用すると、ソートキーとして指定したプロパティの値が重複している場合に、最初の1つだけを保持して残りを破棄します。
# イベントログから、ソース名の一覧を一意に取得する
Get-EventLog -LogName System -Newest 1000 | Sort-Object -Property Source -Unique
注意点として、-Uniqueは大文字と小文字を区別しないのがデフォルトの動作です。
もし大文字と小文字の違いを厳密に区別して重複排除したい場合は、-CaseSensitiveパラメータを併用してください。
データ型による並べ替えの挙動
Sort-Objectは、プロパティのデータ型を自動的に判別して適切な並び替えを行います。
文字列型(String)であれば辞書順、数値型(Int, Doubleなど)であれば数値の大小、日付型(DateTime)であれば時系列順となります。
しかし、テキストファイルから読み込んだ数字など、型が「文字列」として認識されている場合は注意が必要です。
# 文字列として比較される例(10が2より前に来る可能性がある)
$data = "1", "10", "2", "20"
$data | Sort-Object
1
10
2
20
これを数値として正しく並び替えるには、前述のスクリプトブロックを使って型キャストを行います。
# 数値型(int)にキャストしてから並び替える
$data | Sort-Object -Property { [int]$_ }
1
2
10
20
このように、意図した順序にならない場合はデータ型を確認し、必要に応じてキャストを行うのがコツです。
パフォーマンスに関する考慮事項
非常に大きなデータセット(数万件、数百万件のオブジェクト)を処理する場合、Sort-Objectはメモリを大量に消費する可能性があります。
なぜなら、並び替えを行うためにはすべてのデータを一度メモリ上に読み込む必要があるからです。
パフォーマンスを最適化するためのアプローチをいくつか紹介します。
フィルタリングを先に行う
パイプラインの早い段階で Where-Object を使い、対象となるオブジェクトの数を減らしてから Sort-Object に渡すようにしましょう。
# 効率的:フィルタリング後にソート
Get-Service | Where-Object Status -eq "Running" | Sort-Object Name
# 非効率:全件ソートした後にフィルタリング
Get-Service | Sort-Object Name | Where-Object Status -eq "Running"
必要なプロパティだけを選択する
オブジェクトが持つ膨大なプロパティのうち、並び替えと出力に必要なものだけに絞り込むことで、メモリ使用量を抑えることができます。
Select-Objectを組み合わせて、不要なデータをパイプラインから削ぎ落とす習慣をつけましょう。
実践例:システム管理での活用シナリオ
ここでは、システム管理の現場で即座に役立つ Sort-Object の具体的な活用例をいくつか紹介します。
1. 特定の拡張子を持つファイルを更新日時順に並べる
古いログファイルを特定して削除対象を検討する際に便利です。
Get-ChildItem -Path "C:\Logs" -Filter "*.log" | Sort-Object -Property LastWriteTime
2. CPU使用率の高い上位5つのプロセスを表示する
システムの負荷が高い原因を調査する際に役立ちます。
Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 5
3. IPアドレスの第4オクテットで並び替える
文字列としてのIPアドレスを正しく数値順に並べ替える高度な例です。
# 文字列のIPアドレスリスト
$ips = "192.168.1.10", "192.168.1.2", "192.168.1.100"
# [version]型にキャストすることで数値的に正しくソートされる
$ips | Sort-Object -Property { [version]$_ }
このように、PowerShellの型変換機能を活用することで、複雑なデータ形式も自在にコントロールできます。
よくあるエラーとトラブルシューティング
Sort-Objectを使用していると、まれに期待通りに動かないケースがあります。
プロパティ名の間違い
指定したプロパティ名が存在しない場合、エラーにはなりませんが並び替えが行われません(無視されます)。
Get-Memberコマンドレットを使用して、オブジェクトが本当にそのプロパティを持っているか確認してください。
Null値の扱い
プロパティの値が $null であるオブジェクトが含まれている場合、昇順では最初(一番上)に配置されます。
これはPowerShellの仕様ですが、もし $null を最後に持っていきたい場合は、計算されたプロパティで $null を大きな値に置き換えるなどの工夫が必要です。
カルチャによる並び順の違い
日本語環境特有の並び(濁音の扱いなど)を制御したい場合は、-Cultureパラメータを使用します。
# 日本語のロケールを指定して並び替える
$list | Sort-Object -Culture "ja-JP"
まとめ
Sort-Objectは、PowerShellにおけるデータ操作の基盤となる非常に強力なコマンドレットです。
単一プロパティの昇順・降順といった基本操作から、ハッシュテーブルを用いた複雑な複数条件ソート、スクリプトブロックによる動的な値でのソートまで、その応用範囲は多岐にわたります。
今回解説したテクニックを組み合わせることで、バラバラなデータから価値のある情報を効率的に抽出できるようになります。
日常的なスクリプト作成において、まずは「どのプロパティを基準にすれば最も管理しやすいか」を意識して、Sort-Objectを活用してみてください。
2026年のシステム運用においても、この基礎知識は不変であり、あなたの強力な武器となるはずです。
より高度な自動化を目指すなら、他のコマンドレットとの組み合わせについても学んでいくことをおすすめします。
