PowerShell「foreach」「ForEach-Object」の根本的な違いとスクリプト例「PowerShell」のループ処理に使える4つの構文【前編】

「PowerShell」のスクリプトでループ処理をしたい場合に、使える構文が幾つかある。主要な構文のうち「foreach」「ForEach-Object」を紹介する。

2022年04月06日 10時00分 公開
[Anthony HowellTechTarget]

関連キーワード

プログラミング | Windows


 「Windows」のコマンド実行ツール「PowerShell」は、IT管理者がシステムを構成したり、タスクを自動化したりするのに活用できる。PowerShellのスクリプト(簡易プログラム)でループ処理を使えば、IT管理者は同じスクリプトを繰り返し記述することなく、タスクを反復実行可能になる。

 PowerShellで利用できるループ処理の構文には幾つかの選択肢がある。本連載は、4種類の主要な構文を紹介する。前編はそのうち2種類を取り上げる。

1.foreach

 「foreach」は、配列(同種のデータの集合)の各要素に対して処理を反復する。あるディレクトリ以下に存在する全てのサブディレクトリを調べて、そのサブディレクトリ内のファイルを一覧するには、foreachを使った以下のようなスクリプトを記述すればよい。

$directories = Get-ChildItem -Directory
foreach ($directory in $directories) {
    Get-ChildItem $directory -File
}

 foreachの後ろには、

  • 配列の各要素を表す変数
  • in
  • 配列

を順番に指定する。変数名には単数形の名詞、配列名には複数形の名詞を使用するのが一般的だ。この記法によって、読みやすく分かりやすいスクリプトを作成できる。

2.ForEach-Object

 「ForEach-Object」はforeachと同じループ処理を実行するが、処理の際に「パイプライン」を使用する。パイプラインはあるコマンドの出力結果を別のコマンドに渡す構文を指し、「|」で表現する。foreachの例と同じ処理をForEach-Objectで実行する場合は、次のように記述する。

Get-ChildItem -Directory | ForEach-Object {Get-ChildItem $_ -File}

 foreachとは異なり、ForEach-Objectのループでは反復処理の実行対象を表すのに「$_」を使用する。PowerShellバージョン3.0以降では「$PSItem」を使うこともできる。

 インタラクティブ(対話的)にコマンドを実行する場合、特に「%」をエイリアス(コマンドの別名)に使用する場合は、基本的にforeachよりもForEach-Objectの方が使いやすい。スクリプトで利用する場合はforeachの方が分かりやすい上に、ネスト(入れ子構造)を利用できる。

TechTarget発 エンジニア虎の巻

米国TechTargetの豊富な記事の中から、開発のノウハウや技術知識など、ITエンジニアの問題解決に役立つ情報を厳選してお届けします。

ITmedia マーケティング新着記事

news079.jpg

狙うは「銀髪経済」 中国でアクティブシニア事業を展開する企業とマイクロアドが合弁会社を設立
マイクロアドは中国の上海東犁と合弁会社を設立。中国ビジネスの拡大を狙う日本企業のプ...

news068.jpg

社会人1年目と2年目の意識調査2024 「出世したいと思わない」社会人1年生は44%、2年生は53%
ソニー生命保険が毎年実施している「社会人1年目と2年目の意識調査」の2024年版の結果です。

news202.jpg

KARTEに欲しい機能をAIの支援の下で開発 プレイドが「KARTE Craft」の一般提供を開始
サーバレスでKARTEに欲しい機能を、AIの支援の下で開発できる。