about_If

Descrizione breve

Descrive un comando di linguaggio che è possibile usare per eseguire elenchi di istruzioni in base ai risultati di uno o più test condizionali.

Descrizione lunga

È possibile usare l'istruzione if per eseguire blocchi di codice se un test condizionale specificato restituisce true. È anche possibile specificare uno o più test condizionali aggiuntivi da eseguire se tutti i test precedenti restituiscono false. Infine, è possibile specificare un blocco di codice aggiuntivo che viene eseguito se nessun altro test condizionale precedente restituisce true.

Sintassi

L'esempio seguente illustra la sintassi dell'istruzione if :

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

Quando si esegue un'istruzione if , PowerShell valuta l'espressione <test1> condizionale come true o false. Se <test1> è true, <statement list 1> viene eseguito e PowerShell esce dall'istruzione if . Se <test1> è false, PowerShell valuta la condizione specificata dall'istruzione <test2> condizionale.

Per altre informazioni sulla valutazione booleana, vedere about_Booleans.

Se <test2> è true, <statement list 2> viene eseguito e PowerShell esce dall'istruzione if . Se entrambi <test1> e <test2> restituiscono false, il blocco di <statement list 3> codice viene eseguito e PowerShell esce dall'istruzione if .

È possibile usare più elseif istruzioni per concatenare una serie di test condizionali. Ogni test viene eseguito solo se tutti i test precedenti sono false. Se è necessario creare un'istruzione if che contiene molte elseif istruzioni, prendere in considerazione l'uso di un'istruzione Switch.

Esempi:

L'istruzione più semplice if contiene un singolo comando e non contiene elseif istruzioni o else istruzioni. L'esempio seguente illustra la forma più semplice dell'istruzione if :

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

In questo esempio, se la $a variabile è maggiore di 2, la condizione restituisce true e l'elenco di istruzioni viene eseguito. Tuttavia, se $a è minore o uguale a 2 o non è una variabile esistente, l'istruzione if non visualizza un messaggio.

Aggiungendo un'istruzione Else, viene visualizzato un messaggio quando $a è minore o uguale a 2. Come illustrato nell'esempio seguente:

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.")
}

Per perfezionare ulteriormente questo esempio, è possibile usare l'istruzione elseif per visualizzare un messaggio quando il valore di $a è uguale a 2. Come illustrato nell'esempio seguente:

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.")
}

Uso della sintassi dell'operatore ternario

PowerShell 7.0 ha introdotto una nuova sintassi usando l'operatore ternario. Segue la sintassi dell'operatore ternario C#:

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

L'operatore ternario si comporta come l'istruzione semplificata if-else . L'espressione <condition> viene valutata e il risultato viene convertito in un valore booleano per determinare quale ramo deve essere valutato successivamente:

  • L'espressione <if-true> viene eseguita se l'espressione <condition> è true
  • L'espressione <if-false> viene eseguita se l'espressione <condition> è false

Ad esempio:

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

In questo esempio il valore di $message è Path exists quando Test-Path restituisce $true. Quando Test-Path restituisce $false, il valore di $message è Path not found.

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

In questo esempio, se il servizio è in esecuzione, viene arrestato e, se lo stato non è In esecuzione, viene avviato.

Se un'espressione <condition>, <if-true>o <if-false> chiama un comando, è necessario eseguirne il wrapping tra parentesi. In caso contrario, PowerShell genera un'eccezione di argomento per il comando nell'espressione e l'analisi <condition> delle eccezioni per le <if-true> espressioni e <if-false> .

Ad esempio, PowerShell genera eccezioni per queste ternarie:

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.

E questo esempio analizza:

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

Vedi anche