PowerShell: foreachステートメントによる繰り返し処理

PowerShellでforeach文を使ったコレクションの繰り返し処理 について解説します。

配列や連想配列(ハッシュテーブル) などのコレクションに対してループ処理を行いたい場合は foreach文を使うと便利です。コレクションの要素数だけ確実にループ処理が行われるため、 ループの終了条件を記述する必要がありません。

書式
foreach (変数 in コレクション) {
	繰り返したい処理
}

キーワードは「foreach」と「in」です。 foreachの後に()丸括弧で囲んで「(変数 in コレクション)」と記述します。 配列等のコレクションの各要素が変数に代入され、、 ステートメントブロック内で参照できます。 変数の名前はなんでも構いませんが、 $itemや$valueなどが良く使われます。
foreachは全ての要素に対して繰り返し処理を自動で行ってくれるため、 for文のようにループカウンタでループを管理する必要はありません。

配列のforeachループ

配列の繰り返し処理を行う場合は「(変数 in コレクション)」の コレクション部分に「$配列名」と記述します。

次のコードはforeachによる配列の繰り返し処理例です。 変数$itemに各要素値が入っているのでそのまま要素値を出力しています。

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

foreach ($item in $arr) {
    Write-Host $item
}

# 実行結果
a
b
c

連想配列のforeachループ

連想配列(ハッシュテーブル)は配列と違ってキーと値のペアとなっています。
そのためキー部分のコレクションを取得する場合は「連想配列.Keys」、 値部分のコレクションを取得する場合は「連想配列.Values」を使います。

次のコードは、連想配列$hに対してKeysプロパティを使って キー部分のループ処理を行っています。

$h = @{
    a = 10
    b = 20
    c = 30
}

foreach ($key in $h.Keys) {
    Write-Host $key
}

# 実行結果
c
a
b

連想配列の場合、要素の格納順序は不定なので 上のように初期化時とは違った順序で表示されることが多々あります。

次はValuesプロパティを使って値部分のループ処理を行います。

foreach ($value in $h.Values) {
    Write-Host $value
}

# 実行結果
30
10
20

breakとcontinue

他の繰り返し処理と同じようにforeach文でもループを抜け出す場合はbreak、 次のループへ進む場合はcontinueを使います。

ForEach-Objectのエイリアスforeach

PowerShell特有のまぎらわしい表現を紹介しておきます。
次の処理をみてください。

1..3 | foreach {$_}

# 実行結果
1
2
3

上のコードのforeachはforeach文のforeachではなく、 ForEach-Objectコマンドレットのエイリアス(別名)のforeachです。 エイリアスを使わなければ本来は次のように記述します。

1..3 | ForEach-Object {$_}

PowerShellのコマンドレットにはエイリアス(別名)があって、 上のように紛らわしいコードになる場合があります。 この点は注意が必要です。

PowerShell
PR