Powershell: Tutto quello che volevi sapere sull’istruzione IF

Come molti altri linguaggi, PowerShell ha istruzioni per l’esecuzione condizionale del codice nei tuoi script. Una di queste affermazioni è la dichiarazione if. Oggi faremo un tuffo profondo in uno dei comandi più fondamentali in PowerShell.,

  • Indice
  • l’esecuzione Condizionale
  • se La dichiarazione
  • operatori di Confronto
    • -eq per la parità
      • -ne non è uguale
    • -gt -ge -lt -le per la maggiore o minore di
    • -come jolly partite
    • -match espressione regolare
    • è di tipo
  • Collezione operatori
    • contiene
    • in
  • operatori Logici
    • non
      • !,non cedere alle pressioni
        • Controllo per $null
        • assegnazione di Variabile
      • Alternativo percorso di esecuzione
        • altro
        • if
        • elseif
        • switch
      • Pipeline
        • Array inline
      • per Semplificare la complessità delle operazioni di
        • la continuazione di Riga
        • Pre-calcolo dei risultati
        • Più istruzioni if
        • Utilizzo di funzioni
      • gestione degli errori
      • parole

      esecuzione Condizionale

      Il tuo script avrà spesso bisogno di prendere decisioni e svolgere diverse logica basata su tali decisioni., Questo è ciò che intendo per esecuzione condizionale. Hai un’istruzione o un valore da valutare, quindi esegui diverse sezioni di codice in base a tale valutazione. Questo è esattamente ciò che fa l’istruzione if.

      se L’istruzione

      Ecco un esempio molto semplice di if dichiarazione:

       $condition = $true if ( $condition ) { Write-Output "The condition was true" }

      la prima cosa che Il if dichiarazione non è valutare l’espressione in parentesi., Se valuta $true, allora eseguirà il scriptblock tra parentesi graffe. Se il valore era $false, allora salterebbe su quel scriptblock.

      Nell’esempio precedente, l’istruzione ifstava solo valutando la variabile $condition. Era $truee avrebbe eseguito il comando Write-Output all’interno dello scriptblock.

      In alcune lingue, è possibile inserire una singola riga di codice dopo l’istruzione if e verrà eseguita., Questo non è il caso di PowerShell. È necessario fornire un scriptblock completo con parentesi graffe per farlo funzionare correttamente.

      Operatori di confronto

      La cosa più comune per cui userai l’istruzioneif è confrontare due elementi tra loro. Powershell ha operatori speciali per diversi scenari di confronto. Quando si utilizza un operatore di confronto, il valore sul lato sinistro viene confrontato con il valore sul lato destro.,

      -eq per l’uguaglianza

      Il -eq esegue un controllo di uguaglianza tra due valori per assicurarsi che siano uguali tra loro.

       $value = Get-MysteryValue if ( 5 -eq $value ) { # do something }

      In questo esempio, sto prendendo un valore noto di 5 e confrontandolo con il mio $value per vedere se corrispondono.

      Un possibile caso d’uso è quello di controllare lo stato di un valore prima di intraprendere un’azione su di esso. È possibile ottenere un servizio e verificare che lo stato fosse in esecuzione prima di chiamare Restart-Service su di esso.,

      È comune in altri linguaggi come c# usare ==per l’uguaglianza (es: 5 == $value) ma questo non funziona con powershell. Un altro errore comune che le persone fanno è usare il segno di uguale (es: 5 = $value) che è riservato per assegnare valori alle variabili. Posizionando il tuo valore noto a sinistra, rende più imbarazzante l’errore.

      Questo operatore (e altri) hanno alcune varianti.,

      • -eq maiuscole / minuscole uguaglianza
      • -ieq maiuscole / minuscole uguaglianza
      • -ceq maiuscole e minuscole uguaglianza

      -ne non è uguale

      Molti operatori hanno un correlato operatore di controllo per il risultato opposto. -ne verificherà che i valori non siano uguali tra loro.

       if ( 5 -ne $value ) { # do something }

      Utilizzare questa opzione per assicurarsi che l’azione venga eseguita solo se il valore non è 5., Un buon caso d’uso in cui sarebbe quello di verificare se un servizio era in esecuzione prima di provare ad avviarlo.

      le Variazioni:

      • -ne distinzione tra maiuscole e minuscole non è uguale
      • -ine distinzione tra maiuscole e minuscole non è uguale
      • -cne maiuscole e minuscole non è uguale

      Questi sono solo inversa variazioni di -eq. Raggrupperò questi tipi insieme quando elencherò le variazioni per altri operatori.,

      -gt-ge-lt-le per maggiore o minore di

      Questi operatori vengono utilizzati quando si controlla se un valore è maggiore o minore di un altro valore. Il -gt -ge -lt -le sta per GreaterThan, GreaterThanOrEqual, LessThan e LessThanOrEqual.,mangiatore di o uguale, senza maiuscole

    • -cge maggiore o uguale minuscole
    • -lt meno
    • -ilt meno, distinzione tra maiuscole e minuscole
    • -clt meno, maiuscole e minuscole
    • -le minore o uguale
    • -ile minore o uguale a maiuscole / minuscole
    • -cle minore o uguale a maiuscole e minuscole

    non so perché utilizzare le maiuscole e insensibile opzioni per questi operatori.,

    -come le corrispondenze jolly

    PowerShell ha una propria sintassi di corrispondenza del modello basata su jolly e puoi usarla con l’operatore-like. Questi modelli di caratteri jolly sono abbastanza semplici.

    • ? corrisponde a qualsiasi carattere singolo
    • * corrisponde a qualsiasi numero di caratteri
     $value = 'S-ATX-SQL01' if ( $value -like 'S-*-SQL??') { # do something }

    È importante sottolineare che il modello corrisponde a tutta la stringa., Se hai bisogno di abbinare qualcosa nel mezzo della stringa, dovrai posizionare * su entrambe le estremità della stringa.,iv>

le Variazioni:

  • -like maiuscole / minuscole jolly
  • -ilike maiuscole / minuscole jolly
  • -clike maiuscole e minuscole jolly
  • -notlike maiuscole / minuscole jolly non abbinato
  • -inotlike maiuscole / minuscole jolly non abbinato
  • -cnotlike maiuscole e minuscole jolly non abbinato

match espressione regolare

-match operatore permette di controllare una stringa per una espressione regolare in base match., Utilizzare questo quando i modelli jolly non sono abbastanza flessibili per voi.

 $value = 'S-ATX-SQL01' if ( $value -match 'S-\w\w\w-SQL\d\d') { # do something }

Un modello regex corrisponderà in qualsiasi punto della stringa per impostazione predefinita. Quindi puoi specificare una sottostringa che vuoi abbinare in questo modo:

 $value = 'S-ATX-SQL01' if ( $value -match 'SQL') { # do something }

Regex è un linguaggio complesso a sé stante e vale la pena esaminare. Parlo di più su -match e sui molti modi per usare regex in un altro articolo.,

Variations:

  • -match case insensitive regex
  • -imatch case insensitive regex
  • -cmatch case sensitive regex
  • -notmatch case insensitive regex not matched
  • -inotmatch case insensitive regex not matched
  • -cnotmatch case sensitive regex not matched

-is of type

You are able to check a value’s type with the -is operator.,

 if ( $value -is ) { # do something }

Puoi usarlo se stai lavorando con classi o accettando vari oggetti sulla pipeline. Potresti avere un servizio o un nome di servizio come input. Quindi controlla se hai un servizio e recupera il servizio se hai solo il nome.,

 if ( $Service -isnot ) { $Service = Get-Service -Name $Service }

le Variazioni:

  • -is tipo
  • -isnot non è del tipo

Collezione operatori

Quando si utilizzano gli operatori precedenti con un solo valore, il risultato è $true o $false. Questo viene gestito in modo leggermente diverso quando si lavora con una raccolta. Ogni elemento della raccolta viene valutato e l’operatore restituirà invece ogni valore che valuta $true.,

 PS> 1,2,3,4 -eq 3 3

Funziona ancora correttamente in un’istruzione if. Quindi un valore viene restituito dal tuo operatore, quindi l’intera istruzione è $true.

 $array = 1..6 if ( $array -gt 3 ) { # do something }

C’è una piccola trappola nascosta nei dettagli qui che devo sottolineare. Quando si utilizza l’operatore-ne in questo modo, è facile guardare erroneamente la logica all’indietro., L’utilizzo di-ne con una raccolta restituirà$true se qualsiasi elemento nella raccolta non corrisponde al valore.

 PS> 1,2,3 -ne 4 1 2 3

Questo può sembrare un trucco intelligente, ma abbiamo operatori-containse-inche gestiscono questo in modo più efficiente e-notcontains farà correttamente quello che ti aspetti.

-contiene

L’operatore-contains controllerà la raccolta per il tuo valore., Non appena trova una corrispondenza, restituirà $true.

 $array = 1..6 if ( $array -contains 3 ) { # do something }

Questo è il modo preferito per vedere se una raccolta contiene il tuo valore. Utilizzando Where-Object ( o -eq) camminerà l’intero elenco ogni volta e sarà significativamente più lento.,

le Variazioni:

  • -contains maiuscole / minuscole match
  • -icontains maiuscole / minuscole match
  • -ccontains distinzione tra maiuscole e minuscole
  • -notcontains maiuscole / minuscole non abbinato
  • -inotcontains maiuscole / minuscole non abbinato
  • -cnotcontains maiuscole e minuscole non abbinato

in

-in operatore è come il -contains operatore, eccetto la collezione è sul lato destro.,

 $array = 1..6 if ( 3 -in $array ) { # do something }

Variations:

  • -in case insensitive match
  • -iin case insensitive match
  • -cin case sensitive match
  • -notin case insensitive not matched
  • -inotin case insensitive not matched
  • -cnotin case sensitive not matched

Logical operators

Logical operators are used to invert or combine other expressions.,

non

-not operatore ribalta un’espressione $false $true o del $true $false. Ecco un esempio in cui vogliamo eseguire un’azione quando Test-Path è $false.

 if ( -not ( Test-Path -Path $path ) )

La maggior parte degli operatori di cui abbiamo parlato ha una variazione in cui non è necessario utilizzare l’operatore -not, ma ci sono ancora volte che lo useresti.

!,

È possibile utilizzare!come alias per-not.

 if ( -not $value ){} if ( !$value ){}

Vedrai ! usato più da persone che provengono da altre lingue come c#. Preferisco scriverlo perché trovo difficile vedere quando guardo rapidamente i miei script.

-e

È possibile combinare espressioni con l’operatore-and. Quando lo fai, entrambi i lati devono essere$true perché l’intera espressione sia$true.,

 if ( ($age -gt 13) -and ($age -lt 55) )

In questo esempio, $age deve essere uguale o superiore a 13 per il lato sinistro e inferiore a 55 per il lato destro. Ho aggiunto parentesi extra per renderlo più chiaro in quell’esempio, ma sono opzionali purché l’espressione sia semplice. Ecco lo stesso esempio senza di loro.

 if ( $age -gt 13 -and $age -lt 55 )

La valutazione avviene da sinistra a destra. Se il primo elemento viene valutato in $false, uscirà presto e non eseguirà il confronto corretto., Questo è utile quando è necessario assicurarsi che esista un valore prima di utilizzarlo. Test-Path ad esempio genererà un errore se gli dai un percorso $null.

 if ( $null -ne $path -and (Test-Path -Path $path) )

-o

-or consente di specificare due espressioni e restituisce $true se uno di loro è $true.

 if ( $age -le 13 -or $age -ge 55 )

Proprio come con l’operatore -and, la valutazione avviene da sinistra a destra., Tranne che se la prima parte è$true, allora l’intera istruzione è$true e non elaborerà il resto dell’espressione.

Nota anche come funziona la sintassi per questi operatori. Hai bisogno di due espressioni separate. Ho visto gli utenti provare a fare qualcosa di simile $value -eq 5 -or 6 senza rendersi conto del loro errore.

-xor exclusive o

Questo è un po ‘ insolito. -xor consente a una sola espressione di valutare$true., Quindi se entrambi gli elementi sono$false o entrambi gli elementi sono$true, allora l’intera espressione è$false. Un altro modo per guardare questo è l’espressione è solo $true quando i risultati dell’espressione sono diversi.

È raro che qualcuno possa mai usare questo operatore logico e non riesco a trovare un buon esempio sul motivo per cui lo userei mai.

Operatori bit a bit

Gli operatori bit a bit eseguono calcoli sui bit all’interno dei valori e producono un nuovo valore come risultato., Insegnare agli operatori bitwise è oltre lo scopo di questo articolo, ma ecco la lista loro.

  • -band binario E
  • -bor binario O
  • -bxor binario esclusiva O
  • -bnot binario NON
  • -shl shift a sinistra
  • -shr shift a destra

PowerShell espressioni

Si può usare il normale PowerShell all’interno della condizione.,

 if ( Test-Path -Path $Path )

Test-Path restituisce $true o $false quando viene eseguito. Questo vale anche per i comandi che restituiscono altri valori.

 if ( Get-Process Notepad* )

Valuterà $true se c’è un processo restituito e $false se non c’è nulla., È perfettamente valido per utilizzare la pipeline di espressioni o di altri PowerShell affermazioni come questa:

 if ( Get-Process | Where Name -eq Notepad )

Queste espressioni possono essere combinati con il -and e -or operatori, ma si possono usare le parentesi per rompere loro in sotto-espressioni.

 if ( (Get-Process) -and (Get-Service) )

Controllo per $null

Avere un risultato o di un $null valore restituisce $false nel if istruzione., Quando si controlla specificamente $null, è consigliabile posizionare $null sul lato sinistro.

 if ( $null -eq $value )

Ci sono alcune sfumature quando si tratta di $null valori in PowerShell. Se sei interessato a immergerti più a fondo, ho un articolo su tutto ciò che volevi sapere su null null.

Assegnazione variabile

Ho quasi dimenticato di aggiungere questo fino a quando Prasoon Karunan V me lo ha ricordato.,

Normalmente quando si assegna un valore a una variabile, il valore non viene passato alla pipeline o alla console. Quando si esegue un’assegnazione variabile in un’espressione secondaria, viene passata alla pipeline.

 PS> $first = 1 PS> ($second = 2) 2

Vedi come l’assegnazione$first non ha output e l’assegnazione $second? Quando un’assegnazione viene eseguita in un’istruzioneif, verrà eseguita proprio come l’assegnazione$second sopra., Ecco un esempio pulito su come è possibile utilizzarlo:

 if ( $process = Get-Process Notepad* ) { $process | Stop-Process }

Se$processviene assegnato un valore, l’istruzione sarà$truee quindi$process verrà arrestato.

Assicurati di non confonderlo con-eq perché questo non è un controllo di uguaglianza. Questa è una caratteristica più oscura che la maggior parte delle persone non si rende conto funziona in questo modo.,

Percorso di esecuzione alternativo

L’istruzioneif consente di specificare un’azione non solo quando l’istruzione è$true, ma anche quando è$false. È qui che entra in gioco l’istruzioneelse.

else

L’istruzioneelse è sempre l’ultima parte dell’istruzioneif quando viene utilizzata.

In questo esempio, controlliamo $path per assicurarci che sia un file. Se troviamo il file, lo spostiamo. In caso contrario, scriviamo un avvertimento., Questo tipo di logica di ramificazione è molto comune.

Annidato se

Le istruzioniif eelse prendono un blocco di script, quindi possiamo inserire qualsiasi comando PowerShell al loro interno, inclusa un’altra istruzioneif. Ciò consente di utilizzare una logica molto più complicata.

In questo esempio, testiamo prima il percorso felice e poi agiamo su di esso. Se questo non riesce, facciamo un altro controllo e di fornire informazioni più dettagliate per l’utente.

elseif

Non siamo limitati a un solo controllo condizionale., Possiamo concatenare le istruzioniif eelse invece di nidificarle usando l’istruzioneelseif.

L’esecuzione avviene dall’alto verso il basso. L’istruzione topif viene valutata per prima. Se questo è $false, allora si sposta verso il basso al successivo elseifo else nell’elenco. Quest’ultimoelse è l’azione predefinita da eseguire se nessuno degli altri restituisce$true.,

switch

Al punto tis, ho bisogno di menzionare l’istruzione switch. Fornisce una sintassi alternativa per eseguire più confronti con un valore. Conswitch, si specifica un’espressione e il risultato viene confrontato con diversi valori diversi. Se uno di questi valori mach, viene eseguito il blocco di codice corrispondente. Dai un’occhiata a questo esempio:

 $itemType = 'Role' switch ( $itemType ) { 'Component' { 'is a component' } 'Role' { 'is a role' } 'Location' { 'is a location' } }

Ci sono tre possibili valori che possono corrispondere al$itemType., In questo caso, corrisponderà con Roleeis a role verrà eseguito. Ho usato un esempio molto semplice solo per darti un po ‘ di esposizione all’operatore switch. Parlo di più su tutto ciò che hai sempre voluto sapere sulla dichiarazione switch in un altro articolo.

Pipeline

La pipeline è una caratteristica molto particolare e importante di PowerShell. Qualsiasi valore che non viene soppresso o assegnato a una variabile viene inserito nella pipeline., Il if ci fornisce un modo per sfruttare la pipeline in un modo che non è sempre ovvio.

 $discount = if ( $age -ge 55 ) { Get-SeniorDiscount } elseif ( $age -le 13 ) { Get-ChildDiscount } else { 0.00 }

Ogni blocco di script inserisce i risultati i comandi o il valore nella pipeline. Quindi stiamo assegnando il risultato dell’istruzione if alla variabile $discount. Quell’esempio avrebbe potuto altrettanto facilmente assegnare quei valori alla variabile$discount direttamente in ogni scriptblock., Non posso dire che lo uso molto spesso con l’istruzione if, ma ho un esempio in cui l’ho usato di recente.

Array inline

Ho una funzione chiamata Invoke-SnowSql che avvia un eseguibile con diversi argomenti della riga di comando. Ecco una clip da quella funzione in cui costruisco la serie di argomenti.

Le variabili$Debug e$Path sono parametri sulla funzione forniti dall’utente finale. Li valuto in linea all’interno dell’inizializzazione del mio array., Se$Debug è true, allora quei valori cadono nel$snowSqlParam nella posizione corretta. Lo stesso vale per la variabile $Path.

Semplifica operazioni complesse

È inevitabile che ti imbatti in una situazione che ha troppi confronti da controllare e la tua istruzione if scorre via dal lato destro dello schermo.

Possono essere difficili da leggere e questo ti rende più incline a commettere errori. Ci sono alcune cose che possiamo fare al riguardo.,

Continuazione della riga

Ci sono alcuni operatori in PowerShell che ti permettono di avvolgere il comando alla riga successiva. Gli operatori logici -and e -or sono buoni operatori da utilizzare se si desidera suddividere l’espressione in più righe.

C’è ancora molto da fare lì, ma posizionare ogni pezzo sulla propria linea fa una grande differenza. Generalmente lo faccio solo quando ottengo più di due confronti o se devo scorrere verso destra per leggere uno dei ligic.,

Risultati di pre-calcolo

Possiamo estrarre quell’istruzione dall’istruzione if e controllare solo il risultato.

Questo sembra molto più pulito dell’esempio precedente. Ti viene anche data l’opportunità di utilizzare un nome di variabile che spiega cosa stai veramente controllando. Questo è anche un esempio di codice di auto-documentazione che salva i commenti non necessari.

Più istruzioni if

Possiamo suddividere questo in più istruzioni e controllarle una alla volta. In questo caso useremo un flag o una variabile di tracciamento per combinare i risultati.,

Ho dovuto invertire la logica per far funzionare correttamente la logica del flag. Ogni valutazione è un’istruzione if individuale. Il vantaggio di questo è che quando si esegue il debug, si può dire esattamente cosa sta facendo la logica. Sono stato in grado di aggiungere molto meglio verbosità allo stesso tempo.

L’ovvio svantaggio è che è molto più codice da scrivere. Il codice è più complesso da guardare in quanto richiede una singola riga di logica e la esplode in 25 o più righe.

Usando le funzioni

Possiamo anche spostare tutta quella logica di convalida in una funzione., Guarda come sembra pulito a colpo d’occhio.

 if ( Test-SecureDriveConfiguration -ADUser $user ) { # do something }

Devi ancora creare la funzione per eseguire la convalida, ma rende questo codice molto più facile da lavorare. Rende questo codice più facile da testare. Nei tuoi test, puoi prendere in giro la chiamata a Test-ADDriveConfiguration e hai solo bisogno di due test per questa funzione. Uno in cui restituisce $true e uno in cui restituisce $false. Testare l’altra funzione sarà più semplice perché è così piccola.,

Il corpo di quella funzione potrebbe essere ancora quel one-liner con cui abbiamo iniziato o la logica esplosa che abbiamo usato nell’ultima sezione. Questo funziona bene per entrambi gli scenari e consente di modificare facilmente l’implementazione in seguito.

Gestione degli errori

Un uso molto importante dell’istruzioneif è quello di verificare le condizioni di errore prima di incorrere in errori. Un buon esempio è quello di verificare se una cartella esiste già prima di provare a crearla.,

 if ( -not (Test-Path -Path $folder) ) { New-Item -Type Directory -Path $folder }

Mi piace dire che se ti aspetti che si verifichi un’eccezione, allora non è davvero un’eccezione. Quindi controlla i tuoi valori e convalida le tue condizioni dove puoi.

Se vuoi immergerti un po ‘ di più nella gestione effettiva delle eccezioni, ho un articolo su tutto ciò che avresti sempre voluto sapere sulle eccezioni.

Parole finali

L’istruzione if è un’istruzione così semplice ma è un pezzo fondamentale di PowerShell. Vi troverete a utilizzare questo più volte in quasi ogni script si scrive., Spero che tu abbia una comprensione migliore di prima.

Share

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *