SEブログ

【PowerShell】繰り返し文(While, For)について

こんにちは!SE ブログの相馬です。

 

 

今回は繰り返し文について書いてみました。

PowerShell では他のプログラミング言語同様、繰り返し処理を行うことができます。

これは、ループ処理とも呼ばれています。ループ処理は、「ある条件を満たすまで、処理を繰り返し実行する」になります。ループ処理ができるようになると、同じ処理を繰り返し書かずに済みますので、面倒な処理が楽になり、コードの量も減り簡単になります。

 

 

では早速ですが、繰り返し処理の例を見てみましょう。

 

 

while 文の処理

 

 

While 文の処理について、サンプルと処理の順番を作りました。図でも説明していますので合わせて見てもらえればと思います。

 

  1. 変数 $i に 1 を代入する。
  2. 条件式の結果が True( $i の値が 5 以下)であれば、以下の処理が実行される。
    • Write-Output の処理をしてコンソールに出力する。
    • 1 ずつ足す。
  3. while の処理に戻る。
  4. $i の値が 6 になったら 条件式の結果が False になり処理が終了する。

 

 

$i = 1

while ($i -le 5) {

    Write-Output "iの値が $i";
    $i +=1

}


# 実行結果

iの値が 1
iの値が 2
iの値が 3
iの値が 4
iの値が 5

 

 

以下の図でも処理の説明をしています。

 

 

 

このように while 文は、条件式の後に繰り返しの処理内容で実行されます。
この場合は、条件式が True の場合に処理が実行されて、最後に False になります。

 

 

ただし、最初に False になった場合は、処理が実行されません。

例えば$i の値が最初から 100 だとしたらどうなるでしょうか。

 

 

$i = 100

while ($i -le 5) {

    Write-Output "iの値が $i";
    $i +=1

}

Write-Host "$i の値は 5 以下ではないので処理は終了します。" ← False の処理


# 実行結果

100 の値は 5 以下ではないので処理は終了します。

 

 

条件式の結果は、True ではなく False になります。False の処理が実行されて処理は終了します。

 

 

この条件式についてですが、気を付けなければならない点があります。

条件式の処理が正しくないと、無限ループが発生して処理が永遠と続いてしまいます。

皆さんは実施する必要は無いのですが、実際以下の処理を実行すると無限ループになります。

 

 


PS C:\> $i = 1

while ($i -le 5) {

    Write-Output "iの値が $i";

}
iの値が 1
iの値が 1
iの値が 1
iの値が 1
iの値が 1
iの値が 1
iの値が 1

 

 

以下の図でも処理の説明をしています。

 

 

 

無限ループが始まると、場合によっては PC やシステムが停止する恐れがありますので、気を付けてください。

(上の処理程度であれば、実行してすぐ処理を止めるくらいであれば全然大丈夫だと思います。)

 

 

 

do-while 文の処理

 

 

それでは while と同じような条件式で do-while 文というのがありますので一緒に覚えてしまいましょう。

処理の流れは以下のとおりです。

 

 

  1. 変数 $i に 10 を代入する。
  2. do に入り、以下の処理が実行される。
    • Write-Output の処理をしてコンソールに出力する。
    • $i から 1 を引く。
  3. while で $i に入っている値が 0 以上であれば、 do にループする。
  4. 処理を実行し、最終的に $i の値が -1 になったら、while の条件式が False になり、処理が終了する。

 

 

$i = 10
do {

    Write-Output "カウントダウン: $i"
    $i--

} while ($i -ge 0)


# 実行結果

カウントダウン: 10
カウントダウン: 9
カウントダウン: 8
カウントダウン: 7
カウントダウン: 6
カウントダウン: 5
カウントダウン: 4
カウントダウン: 3
カウントダウン: 2
カウントダウン: 1
カウントダウン: 0

 

 

以下の図でも処理の説明をしています。

 

 

 

このように do-while 文は、処理を実行してから条件式で True か False を判定ます。

 

 

 

For 文の処理

 

 

For 文の処理について、サンプルと処理の順番を作りました。図でも説明していますので合わせて見てもらえればと思います。

 

 

  1. 変数 $i に 0 を代入する。これを変数の初期化と言います。
  2. 条件式の結果が True( $i の値が 10 以下)であれば、以下の処理が実行される。
  3. i++ で $i に 1 を足す。
  4. For の処理に戻る。
  5. $i の値が 11 になったら 条件式の結果が False になり処理が終了する。

 

for($i=0; $i -le 10; $i++) {
    "カウンター : $i"
}


# 実行結果

カウンター : 0
カウンター : 1
カウンター : 2
カウンター : 3
カウンター : 4
カウンター : 5
カウンター : 6
カウンター : 7
カウンター : 8
カウンター : 9
カウンター : 10

 

 

 

以下の図でも処理の説明をしています。

 

 

 

このように For 文は、条件式の後に繰り返しの処理内容で実行されます。
この場合は、条件式が True の場合に処理が実行されて、最後に False になります。

 

 

ただし、最初に False になった場合は、処理が実行されません。

例えば$i の値が最初から 11 だとしたらどうなるでしょうか。

 

for($i=11; $i -le 10; $i++) {
    "カウンター : $i"
}

Write-Host "$i の値は 10 以下ではないので処理は終了します。"


# 実行結果(ループは一度も実行されていない)

11 の値は 10 以下ではないので処理は終了します。

 

 

このように条件式の結果は、True ではなく False になります。False の処理が実行されて処理は終了します。

 

 

それではここで For 文の基本を理解していただけたかと思うので、基本をベースに処理を多くしてみましょう。

 

 

 

今度は、以下のように Player を 1 ~ 5 まで作り、$arg に配列として格納します。

For 文を使い、配列の数以下であれば、Write-Output でコンソールに表示した後に $i に 1 を足します。

 

  1. $arg に Player1 ~ Player5 を代入する。
  2. 変数 $i に 0 を代入する。
  3. $i の値が $arg.Count なので配列の中の数以下の場合は処理が実行される。
    • 処理内容は $arg の配列のインデックスを指定してコンソールに表示する。
  4. i++ で $i に 1 を足す。
  5. For の処理に戻る。
  6. $i の値が 11 になったら 条件式の結果が False になり処理が終了する。

 

$arg = @("Player1", "Player2", "Player3", "Player4", "Player5")

for ($i=0; $i -le $arg.Count; $i++) {
     Write-Output $arg[$i]
}


# 実行結果

Player1
Player2
Player3
Player4
Player5

 

 

 

以下の図でも処理の説明をしています。

 

 

 

 

使い分け

 

 

For 文と While 文が出てきましたが、使い分けについて知りたいですよね。

使い分けとしては、以下のようにになります。

 

 

  • ループ処理の回数が決まっている場合は For文
  • ループ処理の回数が明確に決まっていない場合は While 文

 

 

 

以上になります。いかがでしょうか。

最初は分かりにくいとは思います。条件式はひとつずつ目で追っていき、実際手を動かしてコードを何度も書けば、必ず覚えられるようになります。

 

 

では最後までお読みいただきありがとうございました!