PowerShell: if文を入れ子にする(ネストする)方法
if文の中にif文を入れることを 「入れ子」や「ネスト」と言います。 他のプログラミング言語と同じように、 PowerShellでももちろんif文の入れ子が可能です。
PowerShellでの通常のif文は次のように記述します (elseifやelseは省略)。
if (条件式) { 処理 }
if文を入れ子にする場合は{}波括弧で括ったスクリプトブロック内に 字下げ(インデント)した上で、同じようにif文を記述します。
# if文の入れ子 if (条件式) { if (条件式) { 処理 } }
ネストする場合は 必ず上のように字下げ(インデント)をしてください。 字下げしないと、 次のコードのようにif文の構造がわかりにくくなります。
# 字下げしていない場合(NG例) if (条件式) { if (条件式) { 処理 } }
入れ子(ネスト)の使い所
if文の入れ子をどのような場面で使うのかを説明します。
まず2つの変数 $a, $b を用意します。 $a, $b は共にTrue/Falseの真偽値を持ちます。 そして$a, $bの真偽値に応じて、 下表のように異なる処理を行うとします。
$a がTrue | $a がFalse | |
---|---|---|
$b がTrue | 処理1 | 処理2 |
$b がFalse | 処理3 | 処理4 |
もし入れ子を使わない場合、次のようにif文を書きます。 $aと$bの値の組み合わせを論理演算子を使って条件式にします。
if ($a -and $b){ Write-Host "処理1" } elseif (-!$a -and $b) { Write-Host "処理2" } elseif ($a -and -!$b) { Write-Host "処理3" } else { Write-Host "処理4" }
一方、if文を入れ子にする場合は次のように記述できます。 まず変数$aのTrue/Flaseで分岐させ、 それぞれのステートメントブロックに $bの分岐処理を書きます。
if ($a) { if ($b) { Write-Host "処理1" } else { Write-Host "処理3" } } else { if ($b) { Write-Host "処理2" } else { Write-Host "処理4" } }
このように、 入れ子にすることで条件式がシンプルになり、 コードが見やすくなります。 ただし、必ずしも入れ子にした方が良いとも言いきれないため、 その時の状況に応じて使い分けてください。
入れ子(ネスト)の階層
if文の中にif文を入れた場合、入れ子の階層は2です。 さらにその中にif文を入れた場合の階層は3です。 入れ子の階層のことを入れ子の深さとも言います。
次のコードは入れ子の階層が3のコードです。
if (条件式) { if (条件式) { if (条件式) { 処理 } } }
次に、階層が4のコードを見てみます。
if (条件式) { if (条件式) { if (条件式) { if (条件式) { 処理 } } } }
コードを見てわかるように、 入れ子の階層が深くなればなるほどコードの可読性が悪くなり、 修正する場合も大変です。
入れ子の階層に明確な決まりはありませんが、 できれば入れ子の深さは2か3までにしておく方が良いでしょう。 それ以上深くなるようなら、 if文のロジック自体を考え直すことをおすすめします。
(まとめ記事: PowerShell if文)