この記事では、PowerShellのForループ、Whileループ、Do-Whileループ、およびDo-Untilループについてレビューします。PowerShellのループがどのように構築され、ループに入るためまたはループを終了するための条件をどのように定義するかを説明します。
PowerShell Forループ
Forループはカウントするループであり、特定の回数のタスクを繰り返したり、コレクションを処理したり、インデックス番号でアイテムを指定したりする必要があるときに主に使用されます。テスト条件がtrueに評価され続け、falseになった時に終了します。

Forループの構文は以下の通りです:
for (<Init>; <Condition>; <Repeat>) { <Script Block> }
- <Init>ブロックはループが始まる前にコマンドまたはコマンドセットを実行します。通常、ここはカウント変数を初期化する場所です。
- <Condition>セクションでは条件付きテストを評価します。それがtrueであれば、ループに入り、スクリプトブロック内のコマンドを実行します。その後、結果がfalseになるまで条件が再評価されます。
- <Repeat>プレースホルダは、各ループイテレーションでコンマで区切られた1つ以上のコマンドを実行します。通常、これはカウント変数を変更するために使用されます。
特定の操作を5回繰り返したい場合は、次の例を使用します。
どの機密データがどこに保存されているかを把握し、それに関連するリスクを評価し、ManageEngineのデータ保護ソフトウェアであるDataSecurity Plusを使用してポリシーに基づいたデータ保護対策を実装します。今日から、完全に機能した30日間の無料トライアルを開始してください。
for ($var = 1; $var -le 5; $var++) { Write-Host The value of Var is: $var } Write-Host End of for loop.

ここでは、変数が値1で初期化され、5未満であるため、ループに入りスクリプトブロックが実行されます。各反復ごとに変数の値が1ずつ増加し、条件に対して評価され、結果がfalseになるまで続きます。
条件は最初に評価されるため、結果がfalseである場合、コマンドブロックは実行されません:
for ($var = 6; $var -le 5; $var++) { Write-Host The value of Var is: $var } Write-Host End of for loop.

必要に応じて、論理演算子を使用してさらなる条件を指定することができます。この場合、複数の条件を追加しました。論理演算子-andは、両方の条件がtrueの場合にのみtrueとなるため、式$var -ne 3がfalseの状態になると、ループが停止します。
for ($var = 1; $var -le 5 -and $var -ne 3; $var++) { Write-Host The value of Var is: $var } Write-Host End of for loop.

前述したように、<Init>および<Repeat>プレースホルダーで1つ以上のコマンドを実行できます。以下の例では、初期値が1の変数$var1があり、増加し、その値が5以下かどうかをテストするよう評価されます。
ただし、2つ目の変数$var2もあります。初期値は5で、減算されますが、条件の一部として評価されません。
for (($var1 = 1), ($var2 = 5); $var1 -le 5; ($var1++), ($var2--)) { Write-Host The value of Var1 is: $var1 Write-Host The value of Var2 is: $var2 } Write-Host End of for loop.

PowerShellのループ条件を定義する方法
PowerShellでは、コマンドは順次実行されます。しかし、特定の条件が満たされるまであるコマンドまたはコマンドセットを繰り返し実行する必要があることがあります。これがループと呼ばれます。
PowerShellにおいて、ループに入る条件や抜ける条件を定義するには、比較演算子を使用する必要があります。これらを使用すると、値を比較したり特定のパターンに一致する値を見つけたりできます。その結果は、ループの論理によって評価される真偽値(trueまたはfalse)となります。
比較演算子を使用して数値を比較することができます。
Operation | Result |
2 -eq 2 | True |
2 -eq 5 | False |
3 -gt 7 | True |
5 -lt 3 | False |
また、文字列の値を比較演算子を使用して比較することもできます。
どの機密データがどこに保存されているかを把握し、それに関連するリスクを評価し、ManageEngineのデータ保護ソフトウェアであるDataSecurity Plusを使用してポリシーベースのデータ保護対策を実装してください。始めてみるには、30日間の無料トライアルを今すぐ開始してください。
Operation | Result |
‘PowerShell’ -eq ‘powershell’ | True |
‘PowerShell’ -eq ‘cmd’ | False |
‘PowerShell’ -like ‘power*’ | True |
‘PowerShell’ -notlike ‘*shell’ | False |
PowerShellのForeachループ
Foreachループはコレクション内のアイテムを反復処理するために使用されます。このシナリオでは、評価する条件はありませんが、ループはコレクション内のすべてのアイテムが処理されるまで繰り返されます。
<Figure Foreach_Diagram.png> The syntax for a Foreach loop is the following: foreach ($<item> in $<collection) { <Script Block> }
ここでは、まずforeachステートメントが始まり、次に反復処理するための変数とコレクションを含む括弧が続きます。その後に実行するスクリプトブロックが続きます。変数は自動的に作成され、ループの各実行の前に配列から値が割り当てられます。
同様に、ループを5回実行するには、5つのアイテムを含むコレクションが必要です。この場合、1から5までの整数値がそれに該当します:
$collection = 1..5 foreach ($item in $collection) { Write-Host The value of Item is: $item } Write-Host End of foreach loop

変数はコレクションの最初の値である1で初期化され、その後スクリプトブロックが実行されます。次の反復では、変数に配列内の次のアイテムである2が割り当てられます。コレクション内のすべてのアイテムが処理されるまで、スクリプトブロックが繰り返し処理されます。
たとえば、コンピュータで動作している最初の5つのサービスを処理する場合、ループは次のようになります:
foreach ($service in (Get-Service | Select-Object -First 5)) { Write-Host Service name is: $service.name and status is $service.status }

ForeachループとコマンドForeach-Objectの間には違いがあることを理解する必要があります。それらを混同するのは簡単です。Foreachループは常にForeachステートメントで始まりますが、Foreach-Objectコマンドは、パイプラインを持つコマンドに続いて、それを介して送信されたオブジェクトを処理します。
PowerShellのWhileループ
PowerShellのWhileステートメントは、条件がtrueと評価される場合にコマンドまたは一連のコマンドを実行するループを作成するために使用されます。スクリプトブロックを実行する前に条件を確認します。条件がtrueである限り、PowerShellは条件がfalseになるまでスクリプトブロックを実行します。

Whileループの構文は次のようになります:
while (<Condition>){<Script Block>}
たとえば、変数varが初期値1であり、ループを5回繰り返したい場合、ループは次のような構造に従う必要があります:
データがどこに保存されているかを把握し、それに関連するリスクを評価し、ManageEngineのデータ保護ソフトウェアであるDataSecurity Plusを使用してポリシーベースのデータ保護対策を実装します。完全機能の30日間無料トライアルで今すぐ始めましょう。
$var = 1 while ($var -le 5) { Write-Host The value of Var is: $var $var++ } Write-Host End of While loop.

上記の例では、変数はループの外で初期化され、スクリプトブロックで増分されます。ループの各サイクルで変数の値を出力するためにWrite-Hostコマンドレットが使用されています。
条件が最初に false である場合、ループはトリガーされません。この例では、変数の値(var = 6)がある場合、ループコマンドは全く機能せず、スクリプトブロックは実行されません。
$var = 6 while ($var -le 5) { Write-Host The value of Var is: $var $var++ } Write-Host End of While loop.

論理演算子を使用してより複雑な条件を使用できます。例えば、変数を5未満で、3と等しくないようにしたい場合、ループは次のようになります:
$var = 1 while ($var -le 5 -and $var -ne 3) { Write-Host The value of Var is: $var $var++ } Write-Host End of While loop.

前述のように、論理演算子 -and を使用すると、両方の条件テストがtrueに評価されるときだけ、true となります。この場合、変数に値3が割り当てられると、2番目の条件は false になります。これにより false の結果が得られ、ループが停止します。
PowerShell Do-While ループ
A Do-While loop is a variant of the While loop, and the main difference is that the script block is executed before the condition is checked. This means that even if the start condition is false, the script block will be executed at least once.

Do-While ループの構文は以下の通りです:
do { <script block> } while (<condition>)
したがって、前述の例と同じ例を使用する場合、コードは次のようになります:
$var = 1 do { Write-Host The value of Var is: $var $var++ } while ($var -le 5) Write-Host End of Do-While loop.

変数 var = 6 を使用して Do-While ループを実行してみましょう。ここでは、条件が false であることをチェックする前に、ループが1回実行されます。
$var = 6 do { Write-Host The value of Var is: $var $var++ } while ($var -le 5) Write-Host End of Do-While loop.

再度、論理演算子を使用することも可能です。前述の例と同じ例を使用する場合、変数の値が3の場合、ループが停止することが分かります。なぜなら、変数を5未満で、3と等しくないようにしたかったからです:
知っている場所でどのような機密データが保管されているかを把握し、それに関連するリスクを評価し、ManageEngineのデータ保護ソフトウェアであるDataSecurity Plusを使用してポリシーベースのデータ保護対策を実装します。今日から完全に機能する30日間の無料トライアルを始めてください。
$var = 1 do { Write-Host The value of Var is: $var $var++ } while ($var -le 5 -and $var -ne 3) Write-Host End of Do-While loop.

PowerShell Do-Untilループ
Do-Untilループは、Do-Whileループと同じように動作します。スクリプトブロックを最初に実行し、次に条件を評価します。ここでの違いは、Do-Whileループがtrueの条件でループに入るのに対し、Do-Untilループはfalseの条件を探してループに入ります。

Do-Untilループの構文は次のとおりです:
do { <script block> } until (<condition>)
見てわかるように、この構造はDo-Whileループとほとんど同じです。ただし、以前の例を使用し続けた場合の結果を見てみましょう:
$var = 1 do { Write-Host The value of Var is: $var $var++ } until ($var -le 5) Write-Host End of Do-Until loop.

条件付きテストがtrueに評価されるため、Do-Untilループはトリガーされません。なぜなら、ループに入るためにはfalseの結果が必要だからです。この場合、ループを5回繰り返したい場合、論理演算子をgreater than(-gt)に変更する必要があります。これにより、最初の5回の繰り返しに対してfalseの結果が得られます:
$var = 1 do { Write-Host The value of Var is: $var $var++ } until ($var -gt 5) Write-Host End of Do-Until loop.

再び、ループに入り続けるために初期条件がfalseである必要があるため、より複雑な式を定義する必要がある場合は、論理演算子にも影響が出ます。
次の例では、変数が5より大きい(必要なfalseの結果)または3と等しいまでループを繰り返すために、-or演算子を使用する必要があります。変数が5より大きく、同時に3と等しい必要がある-and演算子は使用できませんでした。なぜなら、それは無限ループをもたらすからです。
$var = 1 do { Write-Host The value of Var is: $var $var++ } until ($var -gt 5 -or $var -eq 3) Write-Host End of Do-Until loop.

PowerShellのループの制御方法
ループ内での実行のフローを制御するために、キーワードを使用してループを評価せずに抜けたり、現在のイテレーションをスキップしたりできます。これらのキーワードは時々便利ですが、スクリプトを読みにくくする可能性があるため、常に推奨されているわけではありません。
break文
break文は、指定された条件を評価せずに、現在のループを即座に停止して終了し、ループのスクリプトブロック内のコードの残りを実行しません。これにより、PowerShellは残りのコードの実行を続行できます。
breakキーワードの動作は、使用されているループの種類に関係なく同じです。上記の例の1つを使用して、1から5まで数え、カウント変数が3と等しい場合にループを終了します。ただし今回は、テスト条件内で論理演算子を使用する代わりにbreakを追加します。
どの機密データがどこに保存されているかを把握し、それに関連するリスクを評価し、DataSecurity Plus、ManageEngineのデータ保護ソフトウェアを使用してポリシーベースのデータ保護対策を実装します。今すぐ完全機能の30日間無料トライアルを開始してください。
これを達成するために、ifステートメントを使用して終了基準を定義します。
For ($var = 1; $var -le 5; $var++) { if ($var -eq 3) {break} Write-Host The value of Var is: $var } Write-Host End of for loop.

カウント変数の値が3と等しい場合、ifステートメントがトリガーされ、breakキーワードが実行されます。 breakキーワードはスクリプトブロック内のWrite-Hostコマンドの前に配置されているため、後者は処理されません。 ループが停止し、スクリプトは残りのコードを実行し続けます。
continueステートメント
continueステートメントを使用すると、コードの残りの部分をスキップして、ループの最初に戻り、それを終了せずに戻ります。
前回の例と同様に、Forループが使用されますが、この回はカウント変数が3に達したときにループを終了させるのではなく、PowerShellは現在の反復での残りのコードをスキップし、条件テストがfalseになるまでループを続行します。
for ($var = 1; $var -le 5; $var++) { if ($var -eq 3) {Continue} Write-Host The value of Var is: $var } Write-Host End of for loop.

変数の値が3に等しいと、if文がトリガーされ、continue文が実行されます。その後、ループ内のコードの残り部分をスキップして、ループを終了させずに続行します。
結論
PowerShellはさまざまな種類のループをサポートしており、スクリプトを簡素化し、特定のアクションを一貫した方法で繰り返すのにどのように役立つかを理解することは非常に重要です。PetriでPowerShellのヒントやトリックについて詳しく取り上げてきたので、ぜひPowerShellスクリプトの作成方法やForEach Parallelオプションの使用方法など、他のガイドもチェックしてください。
関連記事:
Source:
https://petri.com/how-to-use-powershell-for-while-loops/