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
- -eq per la parità
- 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à ilscriptblock
tra parentesi graffe. Se il valore era$false
, allora salterebbe su quel scriptblock.Nell’esempio precedente, l’istruzione
if
stava solo valutando la variabile$condition
. Era$true
e avrebbe eseguito il comandoWrite-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 unscriptblock
completo con parentesi graffe per farlo funzionare correttamente.Operatori di confronto
La cosa più comune per cui userai l’istruzione
if
è 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 minuscolenon 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
-contains
e-in
che 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 quandoTest-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
nelif
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
$process
viene assegnato un valore, l’istruzione sarà$true
e 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’istruzione
if
consente di specificare un’azione non solo quando l’istruzione è$true
, ma anche quando è$false
. È qui che entra in gioco l’istruzioneelse
.else
L’istruzione
else
è 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 istruzioni
if
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 istruzioni
if
eelse
invece di nidificarle usando l’istruzioneelseif
.L’esecuzione avviene dall’alto verso il basso. L’istruzione top
if
viene valutata per prima. Se questo è$false
, allora si sposta verso il basso al successivoelseif
oelse
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à conRole
eis a role
verrà eseguito. Ho usato un esempio molto semplice solo per darti un po ‘ di esposizione all’operatoreswitch
. 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’istruzioneif
, 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’istruzione
if
è 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. - !,non cedere alle pressioni
- non