この記事は2023年用に更新されました!
スクリプトは決定を行うことができます。どのように?条件付きロジックと呼ばれる概念を使用して。PowerShellのif文とif/else構文は条件を定義する一般的な方法です。
PowerShellスクリプトを作成する際は、特定のタスクまたは目的を念頭に置いて行います。ただし、1つ以上の条件に基づいて複数の可能なアクションがある場合もあります。このような状況に、PowerShellのIf文が登場します。
この記事では、PowerShellのIf-Else構文を学び、その構文と動作を理解します。また、例からPowerShellのIf文を使用してスクリプトに条件付きロジック処理を追加するいくつかの方法も学びます。
PowerShellのIf文の構文の理解
PowerShellのif-else構文は、1つまたは複数の条件式を評価します。以下にIf文の構文が示されています。このスタイルはしばしばフロー制御と呼ばれます。
上記の構文からわかるように、各テストはかっこ()
で囲まれています。テストでは、比較演算子や論理演算子など、さまざまな演算子を使用できます。
ステートメントリストには、テストの結果がtrueに評価された場合に実行するコードが含まれています。
その後、If文グループには3つの可能な文があります。これらは、IF、ELSEIF、ELSE文です。
-
if
文には最初の評価する条件が含まれ、中括弧{}
で囲まれた最初の文リストが続きます。PowerShell if文は、必ず存在する必要がある唯一の文です。 -
elseif
文では条件を追加します。複数の条件がある場合は、複数のElseIf文を追加できます。PowerShellはこれらの条件を順次評価します。 -
else
文には条件を受け入れません。この文には、すべての前の条件がfalseである場合に実行するコードが含まれます。
PowerShellのIf文のロジックフローの理解
PowerShellのIf-Elseの動作をさらに理解するには、そのロジックフローを理解してください。以下の図は、PowerShellのIf-Elseの基本的なフローを示しています。

If文が実行されると、PowerShellは各条件を評価してコードがtrueまたはfalseを返すかどうかを確認します。動作の概要は以下の通りです:
- PowerShellはTest 1の条件を評価します。
- Test 1の結果がtrueを返す場合、If文のリスト内のコードが実行され、PowerShellがIf文を終了します。
- Test 1の結果がfalseを返す場合、PowerShellは次のElseIf文で条件(Testn)を評価し続けます。
- テスト nの結果がfalseを返す場合、PowerShellは次のElseIf文で条件(Test n)を評価し続けます。もし別のElseIf文が存在する場合-OR-
- Test nの結果がfalseを返す場合、Else文内のコードが実行され、PowerShellはIf文を終了します-OR-
- Test nの結果がtrueを返す場合、ElseIf文内のコードが実行され、PowerShellはIf文を終了します。
PowerShell If-Else文の使用
次のセクションでは、スクリプトを記述する際にPowerShell If文がどのように使用されるかのいくつかの例を示します。学んだテクニックは、実際にIf文を使用する必要がある現実の状況に遭遇した場合に、If文の使用方法を指示するのに役立ちます。
単一のIf-Else条件
最も基本的なものから始めると、単一のPowerShell If文です。1つの条件のみをテストする場合は、単一のif文を使用する必要があります。
以下の例では、$num
変数の値が10より大きいかどうかをテストしています。結果がtrueの場合、"$num is greater than 10"
という結果が画面に表示されます。結果がfalseの場合、PowerShellは何もしません。なぜなら、テストする条件が1つだけだからです。
特定の値だけをチェックする場合、たとえば
if ($Value) { }
のようにすると、PowerShellは$Value
が$Null
、0
、$False
、空の文字列、または空の配列でないかどうかをテストします。
上記のコードをPowerShellに貼り付けると、以下の結果が得られます。

今、テスト結果が偽の場合に、PowerShellが何もしないのではなく、デフォルトの「フォールバック」アクションを追加したい場合は、Elseステートメントを追加できます。
以下の例では、$num
変数の値が10より大きくない場合、Elseステートメント内のコードが実行されます。
修正されたコードをPowerShellで実行すると、以下の出力が得られます。

PowerShell 7.0から、Ifステートメントの新しい構文が導入され、三項演算子が使用されます。単一のIfステートメントは、この新しい構文を有効に活用できます。
上記の例と同じく、三項演算子を使用したコードは次のようになります。

PowerShellのIfステートメントで$Nullをテストする
$Null条件をテストするのは簡単だと思うかもしれません。しかし、$Null
値を配置する側は重要です。なぜなら、すべての条件で同じ結果になるとは限らないからです。常に以下のように$Null
条件を左側に配置するのがベストプラクティスです。
$Nullテストを右側に配置し、左側の値がリスト(配列など)である場合、$Null
はフィルターとして機能します。以下の例からわかるように、$Null
を左側に配置すると、一貫したブール結果が得られます。
$List = @(1,2,2,3,4)
$List -NE $Null
$List -EQ $Null
$Null -NE $Null
$Null -EQ $Null

ElseIfを使用した複数のIf-Else条件
複数の条件を評価する場合、1つ以上の ElseIf ステートメントを追加する必要があります。各 ElseIf ステートメントには、テスト式とその実行するコードが含まれます。
以下のスクリプトは、実行されると、CTRL+C
キーストロークが入力されるか、ユーザーが文字 “X” を入力するまで、フルーツ名を要求し続けます。
その後、If ステートメントは、一致する条件が見つかるまで、シーケンス内の各条件を処理します。入力がどの条件にも一致しなかった場合、Else ステートメント内のコードが実行されます。
以下は、PowerShell で上記のスクリプトを実行したときの動作のデモンストレーションです。

フリーディスクスペースの状態を報告
フリーディスクスペースの報告は、システム管理者にとって一般的なタスクの1つです。Windows マシンの固定ディスクのスペース情報を報告する通常の方法は、以下のコードを中心に回ります。
上記のコードが返す情報は、次のスクリーンショットに示すもののようになります。

上記の出力を見ると、ドライブレターやフリースペースの値、その他のプロパティが表示されます。上記の出力は問題ありませんが、直感的ではありません。情報の提示方法は、ディスクスペースがクリティカル、警告、または通常の状態にあるかを示していません。
PowerShell の If ステートメントを使用してコードを改善する
A more intuitive output can be achieved using the PowerShell If-Else statement by adding conditions to check if the free space is over or below certain thresholds. And these thresholds will define the status of the free disk space.
以下の例のスクリプトは、次の操作を実行します:
- 変数
$Critical
の値を使用して、フリースペースのパーセントがクリティカルとタグ付けされる閾値を定義します。 - 変数
$Warning
の値を使用して、空き容量のパーセントがwarningとしてタグ付けされる閾値を定義します。 - ローカルマシンからすべての固定ディスク情報を取得します。
- すべてのディスク情報をループして、空き容量を決定し、その状態にタグを付けます。
- 空き容量のパーセントが
$Warning
変数の値よりも高い場合、ディスクスペースのステータスはnormalとタグ付けされます。 - 空き容量のパーセントが
$Critical
変数の値よりも高い場合、ディスクスペースのステータスはwarningとタグ付けされます。 - 空き容量のパーセントが
$Critical
変数の値以下の場合、ディスクスペースのステータスはcriticalとタグ付けされます。
- 空き容量のパーセントが
- オブジェクトのプロパティ
'Drive Letter'
、'Drive Name'
、'Total Space (GB)'
、'Free Space (GB)'
、'Free Space (%)'
、および'Status'
を構成します。 - 最終報告を返します。
以下のコードをコピーし、スクリプトをGet-DiskSpace.ps1
というファイル名で保存してください。異なる閾値でテストするために$Critical
および$Warning
変数の値を変更することを忘れないでください。
短縮条件を作成するために、if/else 条件の結果を変数に割り当てることもできます。例:
$Status = if ($percentFree -gt $Warning) { 'Normal' }
スクリプトを保存したら、PowerShellでその名前を呼び出してテストしてください。以下は、このスクリプトがどのように機能するかを示すサンプルデモンストレーションです。

出力からわかるように、各ディスクの状態は、複数の条件を使用したPowerShellのIf-Elseの結果である空きディスク容量のパーセンテージによって決定されます。
複数およびネストされたIf-Else
もしも、条件がelse
ブロックで定義されたif-else文があるとします。if-else文が実行されると、if
ブロック内のコードがfalseを返す場合、else
ブロックが呼び出されます。
else
ブロックの内部で、別の条件テストを実行する必要があります。その結果、別のIf-Else文が必要になります。このシナリオはネストされたIf-Elseと呼ばれます。ネストされたIf-Else文は、内部のIf-Elseが外部のIf-Elseの操作の結果に依存する場合に一般的に使用されます。
複数およびネストされたIf-Else文を使用すると、かなり混乱することがあります。重要なポイントは、スキャフォールドの配置を覚えておくこと、およびコードをインデントすることです。コードをインデントすることで、If-Else文を簡単に認識して分離することができます。
複数/ネストされたIf-Else文の例
以下の例のスクリプトは、複数およびネストされたIf-Elseがお互いの結果に依存する方法を示しています。以下のコードのロジックは次のとおりです。
- もし
$SendEmail
が$false
であれば、スクリプトは何もせずに終了します。 - もし
$SendEmail
が$true
であれば、$From
と$To
変数は空であってはならず、nullではない必要があります。そうでない場合、$abortFlag
は1に設定されます。 $SendEmail
が$true
であり、$CCEnabled
が$true
であれば、$CC
変数は空であってはならず、nullではない必要があります。そうでない場合、$abortFlag
は1に設定されます。$SendEmail
が$true
であり、$BCCEnabled
が$true
の場合、$BCC
変数は空または null であってはなりません。それ以外の場合、$abortFlag
は 1 に設定されます。$abortFlag
の値が 1 の場合、スクリプトはこの時点で終了し、その後の処理は行いません。$abortFlag
の値が 0 の場合、スクリプトは最後まで継続します。
以下のコードをコピーして、Send-MyMail.ps1
として保存します。まだ値を変更しないでください。
ファイルを保存したら、次に PowerShell で実行します。以下のデモンストレーションは、変数の値が変更されない場合のスクリプトの結果を示しています。

次に、スクリプトを編集し、すべての変数を適切に更新します。以下のスニペットのように。
変数を編集したら、スクリプトを保存して再度実行します。以下のように同じ結果が表示されるはずです。

そして、変数を変更してネストされた If-Else がどのように影響を受けるかをテストするための組み合わせを試してみてください。独自に変更してテストすることで、論理をさらに理解するのに役立ちます。
要約
本記事では、条件付きロジック構造である PowerShell の If 文について学びました。If-Else 文は、スクリプターが条件をテストした結果に基づいてスクリプトのアクションを指示できるようにします。
この記事の例を参考にすることで、If-Else 文を使用して意思決定駆動のコードを作成する方法やテクニックを学ぶことができました。If-Else 文は単一の条件を使用するだけで簡単になり、ネストされた If-Else 文に深く掘り下げるにつれてより複雑になります。
何を考えますか? If-Elseステートメントについて。この記事を読んだ後、これをもっと多く使用すると考えていますか?ここで獲得した知識を適用できる他の目的は何ですか?