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文

PowerShell
PR