PowerShell: 配列から条件に一致する要素を抽出(フィルタ)

PowerShellで配列から条件に一致する要素のみを抽出したい場合、 Where-Objectコマンドレットを使用します。 Where-Objectは配列等のオブジェクトをフィルタする機能があります。 抽出する際は、 比較演算子や文字列演算子などの演算子を使って条件を記述します。

数値配列から要素を抽出

数値データの入った配列のフィルタを行ってみます。

次のコードは数値配列の中から10以上の要素のみを抽出しています。

$arr = 12, 3, 25, 9, 14, 10

$arr = $arr | Where-Object {$_ -ge 10}

Write-Host $arr  # 12 25 14 10

自動変数「$_」に配列の各要素が格納され、 スクリプトブロック{}内に 記述された条件がTrueとなる要素のみを抽出します。 上の場合は「要素 -ge 10」がTrueとなる要素を取得できます。

次は奇数のデータを取得します。

$arr = 12, 3, 25, 9, 14, 10

$arr = $arr | Where-Object {($_ %  2) -eq 1}

Write-Host $arr  # 3 25 9

2で割った余りが1の場合は奇数です。 偶数の要素を取得したい場合は1の部分を0に変更して 「($_ % 2) -eq 0」と記述します。

文字列配列から要素を抽出

文字列データの入った配列のフィルタを行ってみます。

次のコードは文字列"a"以外の要素を抽出しています。

$arr = "a", "b", "a", "c", "d", "a"

$arr = $arr | Where-Object {$_ -ne "a"}

Write-Host $arr  # b c d

次は-like演算子を使ったワイルドカード検索によるフィルタです。

$arr = "cat", "bat", "but", "cut"

$arr = $arr | Where-Object {$_ -like "*a*"}

Write-Host $arr  # cat bat

次は-match演算子を使った正規表現によるフィルタです。

$arr = "cat", "bat", "but", "cut"

$arr = $arr | Where-Object {$_ -match "c.*"}

Write-Host $arr  # cat cut

使用する演算子

条件を記述する際に使用する演算子の例です。

種類演算子
比較演算子 -eq, -ne, -gt, -ge, -lt, -le
文字列演算子 -like, -notlike, -match, -notmatch

参考サイト
パイプラインからオブジェクトを削除する (Where-Object) - PowerShell | Microsoft Docs

(まとめ記事: PowerShell 配列

PowerShell