Поделиться через


about_If

Краткое описание

Описывает команду языка, используемую для выполнения списков инструкций на основе результатов одного или нескольких условных тестов.

Длинное описание

Инструкцию if можно использовать для запуска блоков кода, если указанный условный тест оценивается как true. Можно также указать один или несколько дополнительных условных тестов для выполнения, если все предыдущие тесты оцениваются как false. Наконец, можно указать дополнительный блок кода, который выполняется, если другой предварительный условный тест не оценивается как 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. Каждый тест выполняется только в том случае, если все предыдущие тесты являются ложными. Если вам нужно создать инструкцию if, содержащую множество операторов elseif, попробуйте использовать вместо этого инструкцию switch.

Примеры:

Самый простой оператор if содержит одну команду и не содержит никаких elseif инструкций или каких-либо else операторов. В следующем примере показана простейшая форма инструкции if:

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

В этом примере, если переменная $a больше 2, условие оценивается как true, а список инструкций выполняется. Однако если $a меньше или равно 2 или не является существующей переменной, оператор 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.")
}

Использование синтаксиса оператора ternary

PowerShell 7.0 представила новый синтаксис с помощью тернарного оператора. Он соответствует синтаксису оператора C# ternary:

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

Оператор ternary ведет себя как упрощенная инструкция if-else. Выражение <condition> вычисляется, и результат преобразуется в логическое значение, чтобы определить, какую ветвь следует оценить следующим образом:

  • Выражение <if-true> выполняется, если выражение <condition> имеет значение true
  • Выражение <if-false> выполняется, если выражение <condition> имеет значение false

Например:

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

В этом примере значение $messagePath exists, когда Test-Path возвращает $true. Когда Test-Path возвращает $false, значение $messagePath not found.

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

В этом примере, если служба запущена, она остановлена и если ее состояние не запущено, оно запущено.

Если выражение <condition>, <if-true>или <if-false> вызывает команду, необходимо упаковать ее в скобки. Если этого не сделать, PowerShell создает исключение аргумента для команды в выражении <condition> и анализ исключений для выражений <if-true> и <if-false> выражений.

Например, PowerShell вызывает исключения для этих ternaries:

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

См. также