Ritorno alle basi: logica condizionale con l’istruzione If di PowerShell

Questo articolo è stato aggiornato per il 2023!

Gli script possono prendere decisioni. Come? Utilizzando un concetto chiamato logica condizionale. L’istruzione if di PowerShell e i costrutti if/else sono i modi comuni per definire le condizioni.

Quando scrivi script PowerShell, lo fai con uno specifico compito o scopo in mente. Ma, un’operazione può avere azioni multiple possibili basate su una o più condizioni. Questa situazione è dove entra in gioco il costrutto If di PowerShell.

In questo articolo, imparerai il costrutto If-Else di PowerShell e comprenderai la sua sintassi e come funziona. Imparerai anche alcuni modi in cui puoi utilizzare l’istruzione If di PowerShell per aggiungere la gestione della logica condizionale nei tuoi script dagli esempi.

Comprensione della sintassi dell’istruzione If di PowerShell

Il costrutto if-else di PowerShell valuta una o più espressioni condizionali. Di seguito vedrai la sintassi dell’istruzione If. Questo stile è spesso chiamato controllo del flusso.

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

Come puoi vedere dalla sintassi sopra, ogni test è racchiuso tra parentesi (). I test possono utilizzare diversi operatori, come gli operatori di confronto e operatori logici,

Le liste delle istruzioni contengono il codice destinato ad essere eseguito se il risultato del test si valuta a vero.

Quindi, ci sono tre possibili dichiarazioni in un gruppo di istruzioni If. Queste sono le dichiarazioni IF, ELSEIF e ELSE.

  • L’istruzione if contiene il primo test da valutare, seguito dall’elenco della prima dichiarazione racchiusa tra parentesi graffe {}. L’istruzione PowerShell if è l’unica istruzione richiesta per essere presente.
  • L’istruzione elseif è dove si aggiungono le condizioni. È possibile aggiungere più istruzioni ElseIf quando si hanno più condizioni. PowerShell valuterà ciascuna di queste condizioni in sequenza.
  • L’istruzione else non accetta alcuna condizione. L’elenco delle istruzioni in questa istruzione contiene il codice da eseguire se tutte le condizioni precedenti testate sono false.

Capire il flusso logico dell’istruzione If di PowerShell

Per comprendere meglio come funziona l’If-Else di PowerShell, familiarizzare con il suo flusso logico. Il diagramma qui sotto illustra il flusso di base dell’If-Else di PowerShell.

PowerShell If Statement Logic Flow

Quando viene eseguita l’istruzione if, PowerShell esamina ogni condizione valutando se il codice restituisce true o false. Un riepilogo del comportamento è il seguente:

  • PowerShell valuta la condizione in Test 1.
  • Se il risultato di Test 1 restituisce true, verrà eseguito il codice all’interno dell’elenco dell’istruzione If, quindi PowerShell esce dall’istruzione If.
  • Se il risultato di Test 1 restituisce false, PowerShell continua a valutare la condizione (Test n) nella successiva istruzione ElseIf.
  • Se il risultato di Test n restituisce false, PowerShell continua a valutare la condizione (Test n) nel successivo statement ElseIf, se esiste un altro statement ElseIf -OPPURE-
  • Se il risultato del Test n restituisce false, il codice nello statement Else viene eseguito e PowerShell uscirà dallo statement If -OPPURE-
  • Se il risultato del Test n è true, il codice nello statement ElseIf viene eseguito e PowerShell uscirà dallo statement If.

Utilizzo dello Statement If-Else di PowerShell

Le sezioni successive sono vari esempi di come viene utilizzato lo statement If di PowerShell durante la scrittura di script. Le tecniche che imparerai possono guidarti nell’uso dello statement If nel caso tu incontri una situazione reale che richieda il suo utilizzo.

Condizione If-Else Singola

Iniziando con il più basilare, troviamo il singolo statement If di PowerShell. Dovresti utilizzare un singolo statement if quando c’è solo una condizione da testare.

Nell’esempio seguente si verifica se il valore della variabile $num è maggiore di 10. Se il risultato è true, verrà visualizzato il messaggio "$num è maggiore di 10". Se il risultato è false, PowerShell non fa nulla perché c’è solo una condizione da testare.

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

Se controlli solo per un valore specifico, come if ($Value) { }, allora PowerShell testerà se il $Value non è $Null, 0, $False, una stringa vuota o un array vuoto.

Incollando il codice sopra in PowerShell otterrai il risultato mostrato di seguito.

Single If Condition Example

Ora, puoi aggiungere l’istruzione Else se vuoi aggiungere un’azione predefinita “fallback” anziché lasciare che PowerShell non faccia nulla quando il risultato del test è falso.

Nell’esempio sottostante, il codice nell’istruzione Else verrà eseguito se il valore della variabile $num NON è maggiore di 10.

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

Eseguendo il codice modificato in PowerShell otterrai l’output mostrato di seguito.

Single If statement condition

A partire da PowerShell 7.0, è stata introdotta una nuova sintassi per l’istruzione If utilizzando un operatore ternario. Le singole istruzioni If possono fare buon uso di questa nuova sintassi.

Utilizzando lo stesso esempio sopra, ecco come apparirebbe il codice con l’operatore ternario.

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

Test per $Null in un’istruzione If di PowerShell

Potresti pensare che il test per una condizione $Null sia semplice. Ma, il lato su cui si colloca il valore $Null è importante poiché potrebbe non produrre lo stesso risultato in ogni condizione. È una pratica consigliata mettere sempre la condizione $Null a sinistra come segue.

$Null -NE $Value

Se metti il test $Null sul lato destro e il valore sul lato sinistro è una lista, come ad esempio un array, allora $Null agirà come un filtro. Come puoi vedere dall’esempio sotto, se $Null è posto sul lato sinistro, otterrai risultati booleani consistenti.

$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

Condizioni multiple If-Else con ElseIf

Quando si valutano più condizioni, è necessario aggiungere una o più istruzioni ElseIf. Ogni istruzione ElseIf contiene l’espressione di test e il relativo codice da eseguire.

Lo script sottostante, quando eseguito, continuerà a richiedere il nome di un frutto fino a quando non verrà emesso il tasto CTRL+C, o l’utente inserisce la lettera “X“.

Quindi, l’istruzione If esaminerà ogni condizione in sequenza fino a trovare una corrispondenza. Se l’input non corrisponde a nessuna delle condizioni, verrà eseguito il codice all’interno dell’istruzione 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'
    }
}

Di seguito è riportata una dimostrazione del comportamento dello script sopra descritto durante l’esecuzione in PowerShell.

Multiple If-Else conditions

Segnalazione dello stato dello spazio disco libero

La segnalazione dello spazio disco libero è un compito comune per gli amministratori di sistema. Il modo solito di segnalare le informazioni sullo spazio dei dischi fissi su una macchina Windows ruota attorno al codice sottostante.

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

Le informazioni restituite dal codice sopra mostreranno qualcosa di simile a quanto mostrato nella prossima schermata.

Plain disk space information report

Come puoi vedere, l’output sopra mostra la lettera del disco, i valori dello spazio libero e altre proprietà. Anche se l’output sopra è corretto, non è intuitivo. Il modo in cui le informazioni sono presentate non indica se lo spazio disco è in uno stato critico, di avviso o normale.

Utilizzo di un’istruzione If di PowerShell per migliorare il codice

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.

Lo script di esempio sottostante esegue le seguenti operazioni:

  • Utilizzando il valore della variabile $Critical, definire la soglia a cui la percentuale di spazio libero verrà contrassegnata come critica.
  • Utilizzando il valore della variabile $Avvertimento, definisci la soglia a cui la percentuale di spazio libero verrà contrassegnata come avviso.
  • Ottenere tutte le informazioni sui dischi fissi dalla macchina locale
  • Loop attraverso tutte le informazioni sui dischi per determinare lo spazio libero e contrassegnarne lo stato.
    • Se la percentuale di spazio libero è superiore al valore della variabile $Avvertimento, lo stato dello spazio su disco viene contrassegnato come normale.
    • Se la percentuale di spazio libero è superiore al valore della variabile $Critico, lo stato dello spazio su disco viene contrassegnato come avviso.
    • Se la percentuale di spazio libero è inferiore o uguale al valore della variabile $Critico, lo stato dello spazio su disco viene contrassegnato come critico.
  • Comporre le proprietà dell’oggetto 'Lettera dell'unità', 'Nome dell'unità', 'Spazio totale (GB)', 'Spazio libero (GB)', 'Spazio libero (%)' e 'Stato'.
  • Restituisci il rapporto finale.

Copia il codice qui sotto e salva lo script con il nome di file Get-DiskSpace.ps1. Non dimenticare di modificare i valori delle variabili $Critical e $Warning per testare con soglie diverse.

# Definire le soglie in percentuale
$Critical = 20
$Warning = 70

# Ottenere tutte le informazioni sui dischi fissi
$diskObj = Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object { $_.DriveType -eq 3 }

# Inizializzare un array vuoto che conterrà i risultati finali
$finalReport = @()

# Iterare ogni informazione sul disco
$diskObj.foreach(
    {
        # Calcolare la percentuale di spazio libero
        $percentFree = [int](($_.FreeSpace / $_.Size) * 100)

        # Determinare lo "Stato"
        if ($percentFree -gt $Warning) {
            $Status = 'Normal'
        }
        elseif ($percentFree -gt $Critical) {
            $Status = 'Warning'
        }
        elseif ($percentFree -le $Critical) {
            $Status = 'Critical'
        }

        # Comporre le proprietà dell'oggetto da aggiungere al rapporto
        $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
        }

        # Aggiungere l'oggetto al rapporto finale
        $finalReport += New-Object psobject -property $tempObj
    }
)

return $finalReport

Puoi anche assegnare il risultato della condizione if/else a una variabile, ad esempio $Status = if ($percentFree -gt $Warning) { 'Normale' } per potenzialmente creare una condizione più breve.

Una volta salvato lo script, testalo chiamando il suo nome in PowerShell. Qui di seguito è mostrata una dimostrazione di esempio di come funziona questo script.

Free Disk Space Status Command Output

Come puoi vedere dall’output, lo stato di ogni disco è determinato dalla percentuale di spazio disco libero, che è stato il risultato dell’uso di più condizioni con If-Else di PowerShell.

If-Else Multipli e Annidati

Supponiamo di avere un’istruzione if-else con una condizione definita nel blocco else. Quando viene eseguita l’istruzione if-else, il blocco else viene invocato se il codice all’interno del blocco if restituisce false.

All’interno del blocco else, è necessario eseguire un altro test condizionale. Di conseguenza, è necessaria un’altra istruzione If-Else. Questo scenario è chiamato If-Else nidificato. L’istruzione If-Else nidificata è comunemente utilizzata se l’If-Else interno dipende dal risultato dell’operazione nell’If-Else esterno.

Utilizzare più If-Else nidificati può essere piuttosto confuso. Il punto chiave è ricordare il posizionamento della struttura e assicurarsi di indentare il proprio codice. Indentare il codice aiuterà a riconoscere e separare facilmente le istruzioni If-Else.

Esempio di istruzioni If-Else multiple/nidificate

Lo script di esempio di seguito mostra come più If-Else nidificati possano dipendere dal risultato l’uno dell’altro. La logica del codice di seguito è la seguente.

  • Se $SendEmail è $false, lo script non farà nulla ed uscirà.
  • Se $SendEmail è $true, allora le variabili $From e $To non devono essere vuote o nulle. Altrimenti, il $abortFlag sarà impostato su 1.
  • Se $SendEmail è $true e $CCEnabled è $true, allora la variabile $CC non deve essere vuota o nulla. Altrimenti, il $abortFlag sarà impostato su 1.
  • Se il $SendEmail è $true e il $BCCEnabled è $true, allora la variabile $BCC non deve essere vuota o nulla. Altrimenti, il $abortFlag sarà impostato su 1.
  • Se il valore di $abortFlag è 1, lo script terminerà in questo punto e non proseguirà.
  • Se il valore di $abortFlag è 0, lo script continua fino alla fine.

Copia il codice qui sotto e salvalo come Send-MyMail.ps1. Non modificare ancora nessun valore.

$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
        }
    }
}

Una volta salvato il file, eseguilo in PowerShell, come mostrato di seguito. La dimostrazione qui sotto mostra il risultato dello script quando i valori delle variabili non vengono modificati.

Nested If-Else example

Successivamente, modifica lo script e aggiorna correttamente tutte le variabili, come questo frammento di codice qui sotto.

$SendEmail = $true

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

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

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

---SNIP---

Dopo aver modificato le variabili, salva lo script ed eseguilo di nuovo. Dovrebbe mostrarti lo stesso risultato, come visto di seguito.

Another nested If-else example

Ora, modifica le variabili e prova diverse combinazioni per testare come il If-Else nidificato sarà influenzato. Modificare e testare da soli ti aiuterà a comprendere ulteriormente la logica.

Riepilogo

In questo articolo, hai appreso la costruzione della logica condizionale – la costruzione If Statement di PowerShell. La dichiarazione If-Else consente agli scripter di formulare logiche condizionali e di indirizzare le azioni dei loro script in base ai risultati dei test.

Con gli esempi in questo articolo, dovresti aver imparato modi e tecniche per utilizzare la dichiarazione If-Else nella creazione di un codice basato su decisioni. If-Else può essere semplice utilizzando una singola condizione e diventa più complesso mentre si approfondisce nelle dichiarazioni If-Else nidificate.

Cosa ne pensi dell’istruzione If-Else? È qualcosa che pensi useresti sempre di più dopo aver letto questo articolo? Quali altri scopi puoi considerare dove puoi applicare le conoscenze acquisite qui?

Ulteriori Letture

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