PowerShell: ForEach-Objectで配列や$_を扱う

PowerShellのForEach-Objectコマンドレットは、 パイプラインを介して渡されたオブジェクト(配列等)を繰り返し処理するための コマンドです。 ForEach-Objectのエイリアス(省略形)は「foreach」又は「%」パーセント記号です。 現在のオブジェクトは「$_」に格納されています。

foreachと記述があった場合、 ForEach-Objectコマンドレットと制御構文のforeachステートメントの可能性があります。 見分け方はパイプラインを使っているかどうかです。 「配列 | foreach ...」のようにパイプラインでわたされていればForEach-Object、 パイプラインがなければforeachステートメントだと思って大丈夫です。

ForEach-Objectコマンドレットの書式は次の通りです。

書式
ForEach-Object {繰り返し処理}

ForEach-Objectの次に{}波括弧で囲んだスクリプトブロックとして繰り返したい処理を記述します。

次のコードはパイプラインを介して渡された配列の内容を表示しています。 「$_」は現在のオブジェクトです。

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

$arr | ForEach-Object {$_}

# 実行結果
a
b
c

次のようにスクリプトブロックを複数記述することもできます。

書式
ForEach-Object {初期化処理} {繰り返し処理} {終了処理}

複数記述した場合、最初のブロックが初期化スクリプトブロック、 最後が終了スクリプトブロックとなります。

次のコードはForEach-Objectを使って 数値が格納された配列の合計値を計算しています。 最初が初期化スクリプトブロック、 最後が終了スクリプトブロックです。

$arr = 1 .. 5

$arr | ForEach-Object {$sum = 0}{$sum += $_}{$sum}

# 実行結果
15

省略形を使うかどうか

ForEach-Objectを省略して%パーセント記号を使うことができます。 例えば次のようなコードで書けます。

1..3 | % {$_}

PowerShellを使い慣れている方にとっては便利なエイリアスなのですが、 可読性・メンテナンス性という観点からはあまりおすすめできません。 メンテナンスする時にパーセント記号が何の略かを忘れた場合、 いちいち調べないといけません。

エディタ「Visual Studio Code」に拡張機能「PowerShell」 を入れて使っていますが、 エイリアスを使用すると次のような警告がでます。

'%' is an alias of 'ForEach-Object'. 
Alias can introduce possible problems 
and make scripts hard to maintain. 
Please consider changing alias to its full content.

このように本来のコマンドレット名を使うように推奨してきます。
個人レベルでのプログラムなら何を使おうが自由ですが、 チームで開発する場合は省略形を使わないことをおすすめします。

PowerShell