PowerShellのForループ、Whileループ、およびその他のループの使用方法

この記事では、PowerShellのForループ、Whileループ、Do-Whileループ、およびDo-Untilループについてレビューします。PowerShellのループがどのように構築され、ループに入るためまたはループを終了するための条件をどのように定義するかを説明します。

PowerShell Forループ

Forループはカウントするループであり、特定の回数のタスクを繰り返したり、コレクションを処理したり、インデックス番号でアイテムを指定したりする必要があるときに主に使用されます。テスト条件がtrueに評価され続け、falseになった時に終了します。

PowerShell For Loop

Forループの構文は以下の通りです:

for (<Init>; <Condition>; <Repeat>) {

<Script Block>

}
  • <Init>ブロックはループが始まる前にコマンドまたはコマンドセットを実行します。通常、ここはカウント変数を初期化する場所です。
  • <Condition>セクションでは条件付きテストを評価します。それがtrueであれば、ループに入り、スクリプトブロック内のコマンドを実行します。その後、結果がfalseになるまで条件が再評価されます。
  • <Repeat>プレースホルダは、各ループイテレーションでコンマで区切られた1つ以上のコマンドを実行します。通常、これはカウント変数を変更するために使用されます。

特定の操作を5回繰り返したい場合は、次の例を使用します。

データ保護

どの機密データがどこに保存されているかを把握し、それに関連するリスクを評価し、ManageEngineのデータ保護ソフトウェアであるDataSecurity Plusを使用してポリシーに基づいたデータ保護対策を実装します。今日から、完全に機能した30日間の無料トライアルを開始してください。

Learn More

for ($var = 1; $var -le 5; $var++) {

Write-Host The value of Var is: $var

}

Write-Host End of for loop.
A PowerShell loop repeating the same operation five times

ここでは、変数が値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.
If the initial condition if false, the loop won’t be executed

必要に応じて、論理演算子を使用してさらなる条件を指定することができます。この場合、複数の条件を追加しました。論理演算子-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.
We added another condition to stop the script when the variable reaches a false state.

前述したように、<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.
Two different variables are being updated 

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日間の無料トライアルを今すぐ開始してください。

Learn More

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
We ran a PowerShell ForEach loop with a collection of five items.

変数はコレクションの最初の値である1で初期化され、その後スクリプトブロックが実行されます。次の反復では、変数に配列内の次のアイテムである2が割り当てられます。コレクション内のすべてのアイテムが処理されるまで、スクリプトブロックが繰り返し処理されます。

たとえば、コンピュータで動作している最初の5つのサービスを処理する場合、ループは次のようになります:

foreach ($service in (Get-Service | Select-Object -First 5)) {

Write-Host Service name is: $service.name and status is $service.status

}
This script shows the first five services working on our computer

ForeachループとコマンドForeach-Objectの間には違いがあることを理解する必要があります。それらを混同するのは簡単です。Foreachループは常にForeachステートメントで始まりますが、Foreach-Objectコマンドは、パイプラインを持つコマンドに続いて、それを介して送信されたオブジェクトを処理します。

PowerShellのWhileループ

PowerShellのWhileステートメントは、条件がtrueと評価される場合にコマンドまたは一連のコマンドを実行するループを作成するために使用されます。スクリプトブロックを実行する前に条件を確認します。条件がtrueである限り、PowerShellは条件がfalseになるまでスクリプトブロックを実行します。

Diagram showing how a PowerShell While loop works

Whileループの構文は次のようになります:

while (<Condition>){<Script Block>}

たとえば、変数varが初期値1であり、ループを5回繰り返したい場合、ループは次のような構造に従う必要があります:

データ保護

データがどこに保存されているかを把握し、それに関連するリスクを評価し、ManageEngineのデータ保護ソフトウェアであるDataSecurity Plusを使用してポリシーベースのデータ保護対策を実装します。完全機能の30日間無料トライアルで今すぐ始めましょう。

Learn More

$var = 1

while ($var -le 5)

{

Write-Host The value of Var is: $var

$var++

}

Write-Host End of While loop.
Example of a loop running five times

上記の例では、変数はループの外で初期化され、スクリプトブロックで増分されます。ループの各サイクルで変数の値を出力するために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.
The result of the loop if the initial condition is false

論理演算子を使用してより複雑な条件を使用できます。例えば、変数を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.
Running the loop with a variable we want to be less than 5 and not equal to 3

前述のように、論理演算子 -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.

Diagram showing how a PowerShell Do-While loop works

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.
Running a 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.
The script was still executed even though the initial condition was false.

再度、論理演算子を使用することも可能です。前述の例と同じ例を使用する場合、変数の値が3の場合、ループが停止することが分かります。なぜなら、変数を5未満で、3と等しくないようにしたかったからです:

データの保護

知っている場所でどのような機密データが保管されているかを把握し、それに関連するリスクを評価し、ManageEngineのデータ保護ソフトウェアであるDataSecurity Plusを使用してポリシーベースのデータ保護対策を実装します。今日から完全に機能する30日間の無料トライアルを始めてください。

Learn More

$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.
The script stops because we wanted our variable to be less than 5 and not equal to 3

PowerShell Do-Untilループ

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

Diagram showing how a PowerShell Do-Until loop works

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.
The Do-Until loop is not triggered as it needs an initial false result

条件付きテストが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.
Changing the logical operator to ‘greater than’ provides us a false result for the first iterations of the 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.
We use the -or operator to have the Do-Until loop repeat until our variable is greater than 5 or equal to 3

PowerShellのループの制御方法

ループ内での実行のフローを制御するために、キーワードを使用してループを評価せずに抜けたり、現在のイテレーションをスキップしたりできます。これらのキーワードは時々便利ですが、スクリプトを読みにくくする可能性があるため、常に推奨されているわけではありません。

break文

break文は、指定された条件を評価せずに、現在のループを即座に停止して終了し、ループのスクリプトブロック内のコードの残りを実行しません。これにより、PowerShellは残りのコードの実行を続行できます。

breakキーワードの動作は、使用されているループの種類に関係なく同じです。上記の例の1つを使用して、1から5まで数え、カウント変数が3と等しい場合にループを終了します。ただし今回は、テスト条件内で論理演算子を使用する代わりにbreakを追加します。

データ保護

どの機密データがどこに保存されているかを把握し、それに関連するリスクを評価し、DataSecurity Plus、ManageEngineのデータ保護ソフトウェアを使用してポリシーベースのデータ保護対策を実装します。今すぐ完全機能の30日間無料トライアルを開始してください。

Learn More

これを達成するために、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.
We’ve used a break statement instead of using logical operators to stop the script

カウント変数の値が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.
The if statement is triggered when the value of the variable is equal to 3

変数の値が3に等しいと、if文がトリガーされ、continue文が実行されます。その後、ループ内のコードの残り部分をスキップして、ループを終了させずに続行します。

結論

PowerShellはさまざまな種類のループをサポートしており、スクリプトを簡素化し、特定のアクションを一貫した方法で繰り返すのにどのように役立つかを理解することは非常に重要です。PetriでPowerShellのヒントやトリックについて詳しく取り上げてきたので、ぜひPowerShellスクリプトの作成方法ForEach Parallelオプションの使用方法など、他のガイドもチェックしてください。

関連記事:

Source:
https://petri.com/how-to-use-powershell-for-while-loops/