about_If
Breve descrizione
Descrive un comando linguistico 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
Nell'esempio seguente viene illustrata 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
contenente molte elseif
istruzioni, è consigliabile usare invece un'istruzione Switch.
Esempi:
L'istruzione più semplice if
contiene un singolo comando e non contiene istruzioni elseif
o else
istruzioni. Nell'esempio seguente viene illustrata 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 questi ternari:
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