Windows PowerShell スクリプトの ForEach ループを確認し、使用する
パイプ処理を行うと、パイプライン内のコマンドが各オブジェクトに適用されます。 場合によっては、ForEach-Object コマンドレットを使用してパイプライン内のデータを処理することが必要になることがあります。 配列にデータを格納する場合、ForEach コンストラクトを使用すると、配列内の各項目を処理できます。
ForEach コンストラクトでは次の構文が使用されます。
ForEach ($user in $users) {
Set-ADUser $user -Department "Marketing"
}
前の例では、Active Directory Domain Services (AD DS) ユーザー オブジェクトを含む $users という名前の配列があります。
ForEach コンストラクトでは、オブジェクトごとに中かっこの間の Windows PowerShell コマンドを 1 回処理します。 コマンドが処理されている場合は、$user が配列の各項目を含む変数です。 最初の繰り返しでは、$user に $users[0] が含まれ、2 番目の繰り返しでは、$user に $user[1] が含まれます。 これは、配列内のすべての項目が 1 回処理されるまで続けられます。
スクリプトでは、ForEach コンストラクトが、配列に配置した項目を処理する最も一般的な方法です。 処理する項目の数を把握する必要がないため、簡単に使用できます。
前の例では、中かっこの間に 1 つのコマンドしかありませんが、多くのコマンドを追加できます。これらはループごとに処理されます。 中かっこの間のコマンドのインデントは、規約上、スクリプトを確認しやすくするためのものです。 インデントは技術的な要件ではありませんが、お勧めします。
ForEach ループ内の変数の名前付けは意味のあるものにする必要があります。 ほとんどの場合、ループで使用される変数を配列の 1 つのインスタンスとして明確に識別します。 たとえば、$users という名前の配列の場合、ループで使用される変数は $user である可能性があります。 配列の最初の文字と同じ 1 文字の変数の例に気付くかもしれません。 しかし、これは、関連していることを簡単に確認できる単純なコードでのみ使用する必要があります。
並列パフォーマンス
PowerShell 7 では、-Parallel パラメーターが ForEach-Object コマンドレットに追加されました。 これにより、パイプラインでは複数のオブジェクトを同時に処理できます。 複数のオブジェクトを同時に処理すると、標準の ForEach ループよりもパフォーマンスが向上する可能性があります。 PowerShell 7 を使用している場合は、この点を考慮する必要があります。 次の例では、-Parallel パラメーターで ForEach-Object を使用する方法について説明します。
$users | ForEach-Object -Parallel { Set-ADUser $user -Department "Marketing" }
既定では、-Parallel パラメーターを使用すると、一度に 5 つの項目を処理できます。 -ThrottleLimit パラメーターを使用して、これを大きくまたは小さく変更できます。