Adam the Automator (Italiano)

Hai mai eseguito uno script o un cmdlet PowerShell e ti sei confrontato con un muro urlante di testo – in rosso – come quello mostrato di seguito?

Esempio di errori in PowerShell

Gli errori possono diventare travolgenti e confusi. E soprattutto, gli errori sono spesso difficili da leggere, il che rende impossibile determinare cosa e dove lo script è andato storto.,

Fortunatamente, hai alcune opzioni in PowerShell per migliorarlo attraverso la gestione degli errori. Utilizzando la gestione degli errori, gli errori possono essere filtrati e visualizzati in modo tale che sia più facile dare un senso. E, comprendere l’errore rende facile aggiungere più logica alla gestione degli errori.

In questo articolo, scoprirai gli errori in PowerShell e come possono essere intercettati per eseguire la gestione degli errori utilizzando i blocchi PowerShell Try Catch(e finally).,

Sommario

Capire come funzionano gli errori in PowerShell

Prima di tuffarsi nella gestione degli errori, cerchiamo prima di coprire alcuni concetti intorno errori in PowerShell. Comprendere gli errori può portare a migliori strategie di gestione degli errori.

La variabile automatica Error Error

In PowerShell, ci sono molte variabili automatiche e una di queste è la variabile automatica$Error. PowerShell utilizza la variabile$Error per memorizzare tutti gli errori riscontrati nella sessione., La variabile$Error è una matrice di errori ordinati per più recenti.

Quando si apre per la prima volta una sessione PowerShell, la variabile$Error è vuota. Puoi controllarlo chiamando la variabile$Error.

L’Errore $variabile è vuota

Come si può vedere, il $Error variabile inizia vuoto., Ma, una volta generato un errore, l’errore verrà aggiunto e memorizzato nella variabile $Error.

Nell’esempio seguente, l’errore viene generato ottenendo deliberatamente un nome di servizio che non esiste.

PS> Get-Service xyzPS> $ErrorPS> $Error.Count
L’errore è in aggiunta ai $variabile di Errore

Come si può vedere dall’output di cui sopra, l’errore generato è stato aggiunto il tag $Error variabile.,

La variabile Error Error contiene una raccolta di errori generati nella sessione PowerShell. Ogni errore può essere accesso chiamando la sua posizione di matrice. L’ultimo errore sarà sempre all’indice 0.

Ad esempio, l’errore più recente può essere recuperato utilizzando $Error.

Le proprietà dell’oggetto Error Error

Poiché tutto in PowerShell è un oggetto, la variabile$Error è un oggetto e gli oggetti hanno proprietà., Collegando la variabile$Error al cmdletGet-Member, si dovrebbe vedere l’elenco delle proprietà disponibili.

$Error | Get-Member
La $Error proprietà dell’oggetto

Per determinare la causa dell’errore, è possibile visualizzare il contenuto di InvocationInfo proprietà utilizzando il comando riportato di seguito.,

$Error.InvocationInfo
Il InvocationInfo proprietà

Ora, si potrebbe fare lo stesso con le altre proprietà e scoprire quali altre informazioni si possono trovare!

Errori di terminazione

Gli errori di terminazione interrompono il flusso di esecuzione quando viene rilevato da PowerShell vs errori di non terminazione. Ci sono diversi modi in cui può verificarsi un errore di terminazione. Un esempio è quando si chiama un cmdlet con un parametro che non esiste.,

Come si può vedere dallo screenshot qui sotto, quando viene eseguito il comando Get-Process notepad, il comando è valido e vengono visualizzati i dettagli del processo di blocco note.

Il processo di blocco note dettagli

Ma, quando un parametro che non esiste è utilizzato come Get-Process notepad -handle 251 il cmdlet consente di visualizzare un messaggio di errore che il handle parametro non è valido. Quindi, il cmdlet esce senza mostrare i dettagli del processonotepad.,

viene generato un Errore perché il parametro non è valido

Non chiude Errori

Non chiude gli errori sono errori che non interrompere l’esecuzione dello script o un comando. Ad esempio, controlla il codice qui sotto. Questo codice ottiene l’elenco dei nomi dei file dall’elenco dei file.file txt. Quindi, lo script passa attraverso ogni nome di file, legge il contenuto di ciascun file e lo emette sullo schermo.

$file_list = Get-Content .\filelist.txtforeach ($file in $file_list) { Write-Output "Reading file $file" Get-Content $file}

Il contenuto della filelist.,file txt sono i nomi dei file mostra nella lista qui sotto.

File_1.logFile_2.logFile_3.logFile_4.logFile_5.logFile_6.logFile_7.logFile_8.logFile_9.logFile_10.log

Ma cosa succede se File_6.log in realtà non esisteva? Quando esegui il codice, ti aspetteresti che si verifichi un errore perché lo script non riesce a trovare File_6.log. Vedrai un output simile mostrato di seguito.

Esempio di errore non fatale

Come si può vedere dallo screenshot del risultato di cui sopra, lo script è stato in grado di leggere le prime cinque file in elenco, ma quando ha provato a leggere il file File_6.,txt, viene restituito un errore. Lo script ha poi continuato a leggere il resto dei file prima di uscire. Non è terminato.

La variabile Er ErrorActionPreference

Finora, hai imparato a conoscere gli errori di terminazione e non terminazione e in che modo differiscono l’uno dall’altro. Ma, lo sapevate che un errore non terminante può essere costretto a essere trattato come un errore di terminazione?

PowerShell ha un concetto chiamato variabili di preferenza. Queste variabili vengono utilizzate per modificare il comportamento di PowerShell in molti modi diversi. Una di queste variabili è chiamata $ErrorActionPreference.,

La variabile $ErrorActionPreference viene utilizzata per modificare il modo in cui PowerShell tratta gli errori non terminanti. Per impostazione predefinita, il valore$ErrorActionPreference è impostato suContinue. La modifica del valore della variabile$ErrorActionPreference inSTOPcostringe PowerShell a trattare tutti gli errori come errori di terminazione.

Utilizzare il codice seguente per modificare il valore$ErrorActionPreference.,

$ErrorActionPreference = "STOP"

Per ulteriori informazioni su altri valori delle variabili valid ErrorActionPreference validi, visitare PowerShell ErrorActionPreference.

Ora, fare riferimento all’esempio utilizzato nella sezione Errori non terminanti in questo articolo. Lo script può essere modificato per includere la modifica in$ErrorActionPreference come il codice mostrato di seguito:

L’esecuzione del codice modificato sopra si comporterà in modo diverso rispetto a prima quando il valore$ErrorActionPreference è impostato sul valore predefinito diContinue.,

Forzare un errore fatale utilizzando il $ErrorActionPreference variabile

Come si può vedere dallo screenshot del risultato di cui sopra, lo script è stato in grado di leggere le prime cinque file in elenco, ma quando ha provato a leggere il file File_6.txt, viene restituito un errore perché il file non è stato trovato. Quindi, lo script è terminato e il resto dei file non viene letto.,

Il valore$ErrorActionPreference è valido solo nella sessione PowerShell corrente. Viene ripristinato il valore predefinito una volta avviata una nuova sessione di PowerShell.

Il parametro comune ErrorAction

Se il valore$ErrorActionPreferenceviene applicato alla sessione PowerShell, il parametroErrorAction si applica a qualsiasi cmdlet che supporta parametri comuni. Il parametroErrorAction accetta gli stessi valori della variabile$ErrorActionPreference.,

Il valore del parametro ErrorAction ha la precedenza sul valore $ErrorActionPreference.

Torniamo indietro e usiamo lo stesso codice nell’esempio precedente. Ma, questa volta, il parametro ErrorAction viene aggiunto alla riga Get-Content.

Dopo aver eseguito il codice modificato, vedrai che anche se $ErrorActionPreference è impostato su Continue, lo script è comunque terminato una volta riscontrato un errore., Lo script è terminato perché il valore del parametro-ErrorAction inGet-Content è impostato suSTOP.

Forzare un errore fatale utilizzando il ErrorAction parametro

Utilizzo di PowerShell Provare Blocchi Catch

A questo punto, hai imparato su di PowerShell errori e come il $ErrorActionPreference variabile e ErrorAction parametri di lavoro., Ora, è il momento di conoscere le cose buone – i blocchi PowerShell Try Catch Finally.

PowerShelltry catch i blocchi (e facoltativifinally block) sono un modo per lanciare una rete attorno a un pezzo di codice e rilevare eventuali errori che restituiscono.

Il codice seguente mostra la sintassi dell’istruzione Try.

try { <statement list>}catch *]{ <statement list>}finally { <statement list>}

Il blocco Try contiene il codice che si desidera che PowerShell “provi” e controlli per eventuali errori., Se il codice nel bloccoTry rileva un errore, l’errore viene aggiunto alla variabile$Error e quindi passato al bloccoCatch.

Il bloccoCatch contiene le azioni da eseguire quando riceve un errore dal bloccoTry. Ci possono essere più blocchiCatch in un’istruzioneTry.

Il bloccoFinally contiene quel codice che verrà alla fine dell’istruzioneTry., Questo blocco viene eseguito indipendentemente dal fatto che un errore non sia stato conteggiato.

Cattura errori non specifici (Catch-All)

Una semplice istruzioneTry contiene unTry e unCatch blocco. Il bloccoFinally è facoltativo.

Ad esempio, per rilevare un’eccezione non specifica, il parametroCatch deve essere vuoto. Il codice di esempio riportato di seguito utilizza lo stesso script utilizzato nella sezione Variabile Er ErrorActionPreference ma modificato per utilizzare i blocchi Try Catch.,

Come puoi vedere dal codice qui sotto, questa volta, l’istruzione foreach è racchiusa all’interno del blocco Try. Quindi, un bloccoCatch contiene il codice per visualizzare la stringaAn Error Occurred se si è verificato un errore. Il codice nel blocco Finally cancella semplicemente la variabile $Error.

Il codice sopra, dopo l’esecuzione in PowerShell, ti darà questo output mostrato di seguito.,

Script è terminato quando si è verificato un errore

L’output di cui sopra mostra che lo script si è verificato un errore, eseguito il codice all’interno del tag Catch blocco, e quindi terminata.

L’errore è stato gestito, che era il punto di gestione degli errori. Tuttavia, l’errore visualizzato era troppo generico. Per mostrare un errore più descrittivo, è possibile accedere alla proprietàException dell’errore passato dal bloccoTry.,

Il codice riportato di seguito viene modificato, in particolare il codice all’interno del tag Catch blocco, per visualizzare il messaggio di eccezione dalla corrente errore che è stato passato alla pipeline – $PSItem.Exception.Message

Questa volta, quando il codice modificato di cui sopra, il messaggio visualizzato è molto più descrittivo.,

Script è terminato con un messaggio di errore descrittivo

la Cattura di Errori Specifici

Ci sono momenti in cui un catch-all di gestione dell’errore non è l’approccio più appropriato. Forse, vuoi che il tuo script esegua un’azione che dipende dal tipo di errore riscontrato.

Come si determina il tipo di errore? Controllando il valoreTypeName della proprietàException dell’ultimo errore., Ad esempio, per trovare il tipo di errore dall’esempio precedente, utilizzare questo comando:

$Error.Exception | Get-Member

Il risultato del codice sopra sarebbe simile allo screenshot qui sotto. Come puoi vedere, viene visualizzato il valore TypeNameSystem.Management.Automation.ItemNotFoundException.

Ottenere il valore di errore TypeName

Ora che conosci il tipo di errore che devi intercettare, modifica il codice per catturarlo in modo specifico., Come vedi dal codice modificato di seguito, ora ci sono due blocchi Catch. Il primo bloccoCatch intercetta un tipo specifico di errore (System.Management.Automation.ItemNotFoundException). Al contrario, il secondo bloccoCatch contiene il messaggio di errore catch-all generico.

Lo screenshot qui sotto mostra l’output del codice modificato sopra.,

Script è terminato con un messaggio di errore specifico

Conclusione

In questo articolo, hai imparato su di errori in PowerShell, le sue proprietà e come si può determinare un errore di tipo specifico. Hai anche imparato la differenza tra il modo in cui la variabile $ErrorActionPreference e il parametro ErrorAction influisce sul modo in cui PowerShell tratta gli errori non terminanti.,

Hai anche imparato come usare i blocchi PowerShell Try Catch Finally per eseguire la gestione degli errori, sia per errori specifici che per un approccio catch-all.

Gli esempi mostrati in questo articolo mostrano solo le basi di come funzionano i blocchiTry Catch Finally. La conoscenza che spero che tu abbia acquisito in questo articolo dovrebbe darti i blocchi di partenza per iniziare ad applicare la gestione degli errori nei tuoi script.,

Ulteriori letture

  • About_Try_Catch_Finally
  • About_Automatic_Variables
  • Back to Basics: Il ciclo foreach di PowerShell
  • Back to Basics: Comprensione degli oggetti PowerShell

Lascia un commento

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