次の方法で共有


about_If

簡単な説明

1 つ以上の条件付きテストの結果に基づいてステートメント リストを実行するために使用できる言語コマンドについて説明します。

詳細な説明

指定した条件付きテストが true と評価された場合は、 if ステートメントを使用してコード ブロックを実行できます。 以前のすべてのテストが false と評価された場合に実行する 1 つ以上の追加の条件付きテストを指定することもできます。 最後に、他の条件付きテストが true と評価されない場合に実行される追加のコード ブロックを指定できます。

構文

次の例は、 if ステートメントの構文を示しています。

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

if ステートメントを実行すると、PowerShell は<test1>条件式を true または false として評価します。 <test1>が true の場合、<statement list 1>が実行され、PowerShell は if ステートメントを終了します。 <test1>が false の場合、PowerShell は、<test2>条件ステートメントで指定された条件を評価します。

ブール評価の詳細については、「 about_Booleans」を参照してください。

<test2>が true の場合、<statement list 2>が実行され、PowerShell は if ステートメントを終了します。 <test1><test2>の両方が false と評価された場合、<statement list 3> コード ブロックが実行され、PowerShell によって if ステートメントが終了します。

複数の elseif ステートメントを使用して、一連の条件付きテストを連結できます。 各テストは、前のすべてのテストが false の場合にのみ実行されます。 多数のelseifステートメントを含むif ステートメントを作成する必要がある場合は、代わりに Switch ステートメントを使用することを検討してください。

例 :

最も単純な if ステートメントには 1 つのコマンドが含まれており、 elseif ステートメントや else ステートメントは含まれません。 次の例は、 if ステートメントの最も単純な形式を示しています。

if ($a -gt 2) {
    Write-Host "The value $a is greater than 2."
}

この例では、 $a 変数が 2より大きい場合、条件は true に評価され、ステートメント リストが実行されます。 ただし、 $a2 以下であるか、既存の変数でない場合、 if ステートメントはメッセージを表示しません。

Else ステートメントを追加すると、$aが 2 以下の場合にメッセージが表示されます。 次の例に示すように、次のようになります。

if ($a -gt 2) {
    Write-Host "The value $a is greater than 2."
}
else {
    Write-Host ("The value $a is less than or equal to 2," +
        " is not created or is not initialized.")
}

この例をさらに絞り込むには、 elseif ステートメントを使用して、 $a の値が 2と等しい場合にメッセージを表示できます。 次の例に示すように、次のようになります。

if ($a -gt 2) {
    Write-Host "The value $a is greater than 2."
}
elseif ($a -eq 2) {
    Write-Host "The value $a is equal to 2."
}
else {
    Write-Host ("The value $a is less than 2 or" +
        " was not created or initialized.")
}

三項演算子構文の使用

PowerShell 7.0 では、三項演算子を使用する新しい構文が導入されました。 C# 三項演算子の構文に従います。

<condition> ? <if-true> : <if-false>

三項演算子は、簡略化された if-else ステートメントのように動作します。 <condition>式が評価され、結果がブール値に変換され、次に評価する分岐が決定されます。

  • <if-true> 式は、<condition> 式が true の場合に実行されます
  • <if-false> 式は、<condition> 式が false の場合に実行されます

次に例を示します。

$message = (Test-Path $path) ? "Path exists" : "Path not found"

この例では、$messageの値は、Test-Path$trueを返すときにPath existsされます。 Test-Path$falseを返すと、$messageの値がPath not foundされます。

$service = Get-Service BITS
$service.Status -eq 'Running' ? (Stop-Service $service) : (Start-Service $service)

この例では、サービスが実行中の場合は停止し、その状態が Running でない場合は開始されます。

<condition><if-true>、または<if-false>式がコマンドを呼び出す場合は、かっこで囲む必要があります。 そうでない場合、PowerShell は、 <condition> 式のコマンドの引数例外を発生させ、 <if-true> 式と <if-false> 式の例外を解析します。

たとえば、PowerShell では、次の三項の例外が発生します。

Test-Path .vscode   ? Write-Host 'exists'   : Write-Host 'not found'
(Test-Path .vscode) ? Write-Host 'exists'   : Write-Host 'not found'
(Test-Path .vscode) ? (Write-Host 'exists') : Write-Host 'not found'
Test-Path: A positional parameter cannot be found that accepts argument '?'.
ParserError:
Line |
   1 |  (Test-Path .vscode) ? Write-Host 'exists'   : Write-Host 'not found'
     |                       ~
     | You must provide a value expression following the '?' operator.
ParserError:
Line |
   1 |  (Test-Path .vscode) ? (Write-Host 'exists') : Write-Host 'not found'
     |                                               ~
     | You must provide a value expression following the ':' operator.

この例では、次を解析します。

(Test-Path .vscode) ? (Write-Host 'exists') : (Write-Host 'not found')
exists

関連項目