PowerShell Ifステートメントを使用した基本的な条件ロジック

この記事は2023年用に更新されました!

スクリプトは決定を行うことができます。どのように?条件付きロジックと呼ばれる概念を使用して。PowerShellのif文とif/else構文は条件を定義する一般的な方法です。

PowerShellスクリプトを作成する際は、特定のタスクまたは目的を念頭に置いて行います。ただし、1つ以上の条件に基づいて複数の可能なアクションがある場合もあります。このような状況に、PowerShellのIf文が登場します。

この記事では、PowerShellのIf-Else構文を学び、その構文と動作を理解します。また、例からPowerShellのIf文を使用してスクリプトに条件付きロジック処理を追加するいくつかの方法も学びます。

PowerShellのIf文の構文の理解

PowerShellのif-else構文は、1つまたは複数の条件式を評価します。以下にIf文の構文が示されています。このスタイルはしばしばフロー制御と呼ばれます。

if (<test1>)
    {<statement list 1>}
[elseif (<test2>)
    {<statement list 2>}]
[else
    {<statement list 3>}]

上記の構文からわかるように、各テストはかっこ()で囲まれています。テストでは、比較演算子論理演算子など、さまざまな演算子を使用できます。

ステートメントリストには、テストの結果がtrueに評価された場合に実行するコードが含まれています。

その後、If文グループには3つの可能な文があります。これらは、IF、ELSEIF、ELSE文です。

  • if文には最初の評価する条件が含まれ、中括弧{}で囲まれた最初の文リストが続きます。PowerShell if文は、必ず存在する必要がある唯一の文です。
  • elseif文では条件を追加します。複数の条件がある場合は、複数のElseIf文を追加できます。PowerShellはこれらの条件を順次評価します。
  • else文には条件を受け入れません。この文には、すべての前の条件がfalseである場合に実行するコードが含まれます。

PowerShellのIf文のロジックフローの理解

PowerShellのIf-Elseの動作をさらに理解するには、そのロジックフローを理解してください。以下の図は、PowerShellのIf-Elseの基本的なフローを示しています。

PowerShell If Statement Logic Flow

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つだけだからです。

$num = 11
if ($num -gt 10) {
    "$num is greater than 10"
}

特定の値だけをチェックする場合、たとえばif ($Value) { }のようにすると、PowerShellは$Value$Null0$False、空の文字列、または空の配列でないかどうかをテストします。

上記のコードをPowerShellに貼り付けると、以下の結果が得られます。

Single If Condition Example

今、テスト結果が偽の場合に、PowerShellが何もしないのではなく、デフォルトの「フォールバック」アクションを追加したい場合は、Elseステートメントを追加できます。

以下の例では、$num変数の値が10より大きくない場合、Elseステートメント内のコードが実行されます。

$num = 9
if ($num -gt 10)
{
    "$num is greater than 10"
}
else
{
    "$num is NOT greater than 10"
}

修正されたコードをPowerShellで実行すると、以下の出力が得られます。

Single If statement condition

PowerShell 7.0から、Ifステートメントの新しい構文が導入され、三項演算子が使用されます。単一のIfステートメントは、この新しい構文を有効に活用できます。

上記の例と同じく、三項演算子を使用したコードは次のようになります。

$num = 11
$num -gt 10 ? "$num is greater than 10" : "$num is NOT greater than 10"
If statement syntax using ternary operator

PowerShellのIfステートメントで$Nullをテストする

$Null条件をテストするのは簡単だと思うかもしれません。しかし、$Null値を配置する側は重要です。なぜなら、すべての条件で同じ結果になるとは限らないからです。常に以下のように$Null条件を左側に配置するのがベストプラクティスです。

$Null -NE $Value

$Nullテストを右側に配置し、左側の値がリスト(配列など)である場合、$Nullはフィルターとして機能します。以下の例からわかるように、$Nullを左側に配置すると、一貫したブール結果が得られます。

$List = @(1,2,2,3,4)
$List -NE $Null
$List -EQ $Null
$Null -NE $Null
$Null -EQ $Null
$Null testing conditions for PowerShell If Statement

ElseIfを使用した複数のIf-Else条件

複数の条件を評価する場合、1つ以上の ElseIf ステートメントを追加する必要があります。各 ElseIf ステートメントには、テスト式とその実行するコードが含まれます。

以下のスクリプトは、実行されると、CTRL+C キーストロークが入力されるか、ユーザーが文字 “X” を入力するまで、フルーツ名を要求し続けます。

その後、If ステートメントは、一致する条件が見つかるまで、シーケンス内の各条件を処理します。入力がどの条件にも一致しなかった場合、Else ステートメント内のコードが実行されます。

While ($fruit -ne "X") {
    $fruit = Read-Host "Name that fruit"

    if ($fruit -eq 'Apple') {
        'I have an Apple'
    }
    elseif ($fruit -eq 'Banana') {
        'I have a Banana'
    }
    elseif ($fruit -eq 'Orange') {
        'I have an Orange'
    }
    else {
        'Sorry, that fruit is not in the list'
    }
}

以下は、PowerShell で上記のスクリプトを実行したときの動作のデモンストレーションです。

Multiple If-Else conditions

フリーディスクスペースの状態を報告

フリーディスクスペースの報告は、システム管理者にとって一般的なタスクの1つです。Windows マシンの固定ディスクのスペース情報を報告する通常の方法は、以下のコードを中心に回ります。

Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object {$_.DriveType -eq 3}

上記のコードが返す情報は、次のスクリーンショットに示すもののようになります。

Plain disk space information report

上記の出力を見ると、ドライブレターやフリースペースの値、その他のプロパティが表示されます。上記の出力は問題ありませんが、直感的ではありません。情報の提示方法は、ディスクスペースがクリティカル、警告、または通常の状態にあるかを示していません。

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変数の値を変更することを忘れないでください。

# パーセンテージで閾値を定義
$Critical = 20
$Warning = 70

# すべての固定ディスク情報を取得
$diskObj = Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object { $_.DriveType -eq 3 }

# 最終結果を保持する空の配列を初期化
$finalReport = @()

# 各ディスク情報を反復処理
$diskObj.foreach(
    {
        # 空き容量のパーセンテージを計算
        $percentFree = [int](($_.FreeSpace / $_.Size) * 100)

        # "ステータス"を決定
        if ($percentFree -gt $Warning) {
            $Status = 'Normal'
        }
        elseif ($percentFree -gt $Critical) {
            $Status = 'Warning'
        }
        elseif ($percentFree -le $Critical) {
            $Status = 'Critical'
        }

        # 報告に追加するオブジェクトのプロパティを構成
        $tempObj = [ordered]@{
            'Drive Letter'     = $_.DeviceID
            'Drive Name'       = $_.VolumeName
            'Total Space (GB)' = [int]($_.Size / 1gb)
            'Free Space (GB)'  = [int]($_.FreeSpace / 1gb)
            'Free Space (%)'   = "{0}{1}" -f [int]$percentFree, '%'
            'Status'           = $Status
        }

        # オブジェクトを最終報告に追加
        $finalReport += New-Object psobject -property $tempObj
    }
)

return $finalReport

短縮条件を作成するために、if/else 条件の結果を変数に割り当てることもできます。例:$Status = if ($percentFree -gt $Warning) { 'Normal' }

スクリプトを保存したら、PowerShellでその名前を呼び出してテストしてください。以下は、このスクリプトがどのように機能するかを示すサンプルデモンストレーションです。

Free Disk Space Status Command Output

出力からわかるように、各ディスクの状態は、複数の条件を使用した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 として保存します。まだ値を変更しないでください。

$SendEmail = $true

$From = ""
$To = ""

$CCEnabled = $true
$CC = ""

$BCCEnabled = $true
$BCC = ""

$abortFlag = 0

if ($SendEmail) {
    if (!$From) {
        Write-Host "[From] is missing" -ForegroundColor Red
        $abortFlag = 1
    }

    if (!$To) {
        Write-Host "[To] is missing" -ForegroundColor Red
        $abortFlag = 1
    }

    if ($CCEnabled) {
        if (!$CC) {
            Write-Host "[CC] is missing" -ForegroundColor Red
            $abortFlag = 1
        }
    }

    if ($BCCEnabled) {
        if (!$BCC) {
            Write-Host "[BCC] is missing" -ForegroundColor Red
            $abortFlag = 1
        }
    }

    if ($abortFlag -eq 1) {
        Write-Host "The abort flag has been tripped. Exit script." -ForegroundColor Red
        break
    }
    else {
        Write-Host "Your email will be sent from this address $From" -ForegroundColor Green
        Write-Host "And will be sent to the following people:" -ForegroundColor Green
        Write-Host "To: $To" -ForegroundColor Green

        if ($CCEnabled -and $CC) {
            Write-Host "CC: $CC" -ForegroundColor Green
        }

        if ($BCCEnabled -and $BCC) {
            Write-Host "BCC: $BCC" -ForegroundColor Green
        }
    }
}

ファイルを保存したら、次に PowerShell で実行します。以下のデモンストレーションは、変数の値が変更されない場合のスクリプトの結果を示しています。

Nested If-Else example

次に、スクリプトを編集し、すべての変数を適切に更新します。以下のスニペットのように。

$SendEmail = $true

$From = "[email protected]"
$To = "[email protected]"

$CCEnabled = $true
$CC = "[email protected]"

$BCCEnabled = $true
$BCC = "[email protected]"

---SNIP---

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

Another nested If-else example

そして、変数を変更してネストされた If-Else がどのように影響を受けるかをテストするための組み合わせを試してみてください。独自に変更してテストすることで、論理をさらに理解するのに役立ちます。

要約

本記事では、条件付きロジック構造である PowerShell の If 文について学びました。If-Else 文は、スクリプターが条件をテストした結果に基づいてスクリプトのアクションを指示できるようにします。

この記事の例を参考にすることで、If-Else 文を使用して意思決定駆動のコードを作成する方法やテクニックを学ぶことができました。If-Else 文は単一の条件を使用するだけで簡単になり、ネストされた If-Else 文に深く掘り下げるにつれてより複雑になります。

何を考えますか? If-Elseステートメントについて。この記事を読んだ後、これをもっと多く使用すると考えていますか?ここで獲得した知識を適用できる他の目的は何ですか?

さらなる読み物

Source:
https://adamtheautomator.com/powershell-if-else/