#10 条件分岐とループで業務効率アップ

条件分岐とループの画像 PowerShell

本日のお題は「条件分岐とループ」です。
条件分岐とはif文「もし~ならば~」を使用してその指定した条件に合っていれば、または合っていなければの処理をさせる文です。
例えば下記のような処理です。

$num = 10
if($num -eq 10){
  Write-Output "numは10です。" # 実行するとこちらが出力される
} else { # elseはifの条件以外の処理を書きます
  Write-Output "numは10ではありません。"
}

この処理を見ただけでは「どこでこんなコード使うんだろう?」となると思いますが、
if文はプログラムを書く上でとてもよく使われるコードなのでしっかり覚えておきましょう。
さらにもう一例文

$weather = "rainny"

# elseifを使うことでさらに別の条件を設定することで処理をさらに分岐させることができます
if($weather -eq "sunny"){
  Write-Host "本日は晴れです。"
} elseif($weather -eq "cloudy") {
  Write-Host "本日は曇りです。"
} elseif($weather -eq "rainny") {
  Write-Host "本日は雨です。"
} else {
  Write-Host "本日の天気予報はまだありません。"
}

条件分岐の一覧です。

構文用途・特徴
if条件が真(True)のときに処理を実行。最も基本的な分岐。
elseifif が偽(False)のとき、別の条件を評価。複数条件に対応。
elseすべての条件が偽だった場合の処理。
switch値に応じて分岐。複数のケースを簡潔に書ける。-Wildcard-Regex も使用可。
?:(三項演算子)簡単な条件分岐を1行で書ける。(条件) ? 値1 : 値2 の形式。

if文の注意点です。
if文は最初の条件から分岐を処理していって、最初にマッチした条件を処理します。
ですので、次の様なコードにならないようにしてください。

$num = 3
if($num -le 5){
  Write-Host "numは5以下です。"
} elseif($num -eq 3){
  Write-Host "numは3です。"
}

本来であれば、「$num -eq 3」の条件処理を実行させたいところですが、その前の条件で「$num -le 5」が合致してしまっているので永遠に実行されません。

次はループです。
先にループの一覧を紹介します。

構文用途・特徴
foreachコレクションの各要素に対して処理を繰り返す。foreach ($item in $list) 形式。
for初期化・条件・増減を指定して繰り返す。C言語風の構文。
while条件が真の間、繰り返す。条件を先に評価。
do { } while少なくとも1回は実行されるループ。条件は後で評価。
do { } until条件が偽の間、繰り返す。while の逆。
foreach-objectパイプライン内で使うループ。ForEach-Object { $_ } の形式。

ループでは主に複数のファイルや二次元配列のように複数のものを処理する時に使用します。
単数でも使えないことはないですが、複数のデータを扱う可能性が高いものの処理で使いましょう。
そして、ループで一番大事なことが無限ループにならないようにすることです。
特にforやwhileでは無限ループに陥る可能性が高いので十分に注意して処理を書きましょう。

よくありそうな無限ループの原因を挙げてみましょう。

# 終了条件がない
while($ture){
  ...
}
# while($true)は文字通り条件がTRUEとなり続けるのでずーっとループします。
# インクリメント(デクリメント)を忘れる・条件にしている変数がリセットされる
for($i = 1; $i -gt 10;){
  ...
}
# 意外とないようであると思います。条件に $i -gt 10 を指定しているにもかかわらずループの最後に $i = 0 でリセットしているとか...
# 比較演算子間違い
while($i = 5){
  ...
}
# =(イコール)は代入です!!正しくは $i -eq 5 です!

無限ループではないのですが、ループを抜けたい時がありますよね。
例えばifで条件を設定してデータを取得したい時。
その時はbreakをループ内に仕込むことで処理を抜けることができます!
他にもcontinueやreturnもあります。

構文用途・特徴
breakループや switch を途中で抜ける。
continue現在のループ処理をスキップして次の繰り返しへ。
return関数内で処理を終了し、値を返す。
# 1から10までの数字を順にチェックし、5を見つけたらループを終了する
for ($i = 1; $i -le 10; $i++) {
    Write-Host "現在の値: $i"
    
    if ($i -eq 5) {
        Write-Host "5を見つけたのでループを終了します。"
        break
    }
}

条件分岐やループはよく使用しますし、とても便利です。
しかし便利である分、条件を丁寧に書いていないとエラーでプログラムが止まってしまうということが多発します。
初心者のうちはエラーから学ぶことも多くあるのでトライ&エラーの精神でやってみましょう!

コメント

タイトルとURLをコピーしました