PowerShellを使っていると、たくさんの情報の中から「特定の条件に合うものだけを抽出したい」という場面がよくあります。たとえば、特定の拡張子を持つファイルだけを取り出したり、実行中のプロセスからCPU使用率の高いものを見つけたりといった作業です。こうした絞り込みに活躍するのが Where-Object
コマンドです。この記事では、Where-Object
の基本的な使い方から、実用的な応用例まで、わかりやすく解説していきます。PowerShellをより効率的に使いこなすための第一歩として、ぜひ参考にしてください。
Where-Objectとは?目的と基本の構文
Where-Object
は、PowerShellでオブジェクトの配列から特定の条件に一致する要素だけを抽出するためのコマンドレットです。
基本構文
<コマンド出力> | Where-Object { $_.プロパティ名 -演算子 値 }
ここでのポイントは、$_
という特殊な変数です。これは、パイプで流れてきたオブジェクトを1つずつ受け取り、その中のプロパティにアクセスするために使います。
例:ファイルサイズが1MB以上のファイルだけを抽出
Get-ChildItem | Where-Object { $_.Length -ge 1MB }
この例では、カレントディレクトリ内のファイルのうち、サイズが1MB以上のものだけを取得しています。
条件式の書き方:よく使う演算子一覧
Where-Object
では、さまざまな条件式を使ってデータをフィルタリングできます。よく使う比較演算子を以下にまとめます。
演算子 | 意味 |
---|---|
-eq | 等しい |
-ne | 等しくない |
-gt | より大きい |
-lt | より小さい |
-ge | 以上 |
-le | 以下 |
-like | パターン一致 |
-match | 正規表現一致 |
例:拡張子が「.txt」のファイルだけ取得
Get-ChildItem | Where-Object { $_.Extension -eq ".txt" }
例:ファイル名に「report」が含まれているファイルを抽出
Get-ChildItem | Where-Object { $_.Name -like "*report*" }
スクリプトブロックの省略記法(PowerShell 3.0以降)
PowerShell 3.0以降では、Where-Object
に省略記法が追加され、よりシンプルに記述できるようになりました。
通常の書き方
Where-Object { $_.Name -like "*log*" }
省略記法
Where-Object Name -like "*log*"
この省略記法は、短くて読みやすいという利点がありますが、複雑な条件には対応できない場合があるため、使い分けが大切です。
複数条件を使ったフィルタリング
Where-Object
では -and
や -or
を使って複数条件を組み合わせることもできます。
例:サイズが1MB以上かつ「.log」ファイルだけを取得
Get-ChildItem | Where-Object { $_.Length -ge 1MB -and $_.Extension -eq ".log" }
例:拡張子が「.txt」または「.csv」のファイルを取得
Get-ChildItem | Where-Object { $_.Extension -eq ".txt" -or $_.Extension -eq ".csv" }
実用例:実行中のプロセスの中から特定の条件で抽出
PowerShellでは、Get-Process
コマンドと組み合わせることで、システム情報を柔軟に取得できます。
例:CPU使用率が10%以上のプロセス
Get-Process | Where-Object { $_.CPU -ge 10 }
例:プロセス名に「chrome」を含むもの
Get-Process | Where-Object { $_.Name -like "*chrome*" }
フィルター対象がネストしている場合の対応方法
オブジェクトのプロパティがさらにオブジェクトを含んでいる場合は、ドット記法を使ってアクセスします。
例:フォルダ内のファイルで、作成日が2024年1月1日以降のもの
Get-ChildItem | Where-Object { $_.CreationTime -ge "2024-01-01" }
応用テクニック:関数との組み合わせ
関数やループと組み合わせて、より柔軟なデータ処理も可能です。
例:特定ディレクトリ内で5MB以上のファイルだけ表示する関数
function Get-LargeFiles {
param(
[string]$Path = "."
)
Get-ChildItem -Path $Path -Recurse |
Where-Object { $_.Length -ge 5MB }
}
このように Where-Object
を関数内で使えば、再利用しやすくなります。
Select-Objectとの違いに注意
Where-Object
と似た名前の Select-Object
がありますが、役割が異なります。
Where-Object
:条件でフィルターするSelect-Object
:表示するプロパティを指定する
例:Where-ObjectとSelect-Objectの併用
Get-Process |
Where-Object { $_.CPU -gt 5 } |
Select-Object Name, CPU
これは「CPU使用率が5以上のプロセスの名前とCPU使用量だけを表示する」という使い方です。
トラブルシューティング:よくあるエラーと対処法
1. プロパティが存在しない エラー
オブジェクトに指定したプロパティが存在しないとエラーになります。まずは Get-Member
で確認しましょう。
Get-Process | Get-Member
2. $_ の書き忘れ
スクリプトブロック内で $_
を使い忘れると正しく動作しません。
まとめ
Where-Object
は、PowerShellで条件に合ったデータを抽出するための強力なツールです。基本的な構文さえマスターすれば、日常的なファイル操作から、システム監視、データ整形まで、あらゆる場面で役立ちます。
特にパイプライン処理と組み合わせることで、直感的かつ効率的なスクリプトを書くことができます。最初は $_
の使い方や演算子に戸惑うかもしれませんが、いくつか試してみるうちに、自然と使いこなせるようになります。ぜひこの記事を参考に、実際に手を動かしてみてください。