Come utilizzare PowerShell Prova finalmente a catturare per gestire gli errori

15 luglio 2021 10258 Visualizzazioni Altre informazioni importanti su PowerShell Prova

Un PowerShell Prova a prendere block viene usato per gestire gli errori negli script di PowerShell. Quando si utilizza PowerShell Prova a prendere blocco per lo scripting è possibile ottenere quanto segue:





  1. Fai in modo che lo script continui a funzionare nonostante un errore
  2. Visualizza e gestisci meglio i messaggi di errore

In questa guida imparerai come usare Powershell Prova a prendere blocchi per gestire i messaggi di errore di terminazione in PowerShell. Inoltre, imparerai come includere il Infine bloccare in a Prova a prendere bloccare.



La guida inizia con la sintassi di Prova a prendere bloccare.

Sfoglia gli argomenti dei post



PowerShell Prova a prendere Sintassi

PowerShell Prova la sintassi di cattura

La sintassi di PowerShell Prova a prendere è…



|_+_|

Il Provare è la parte del blocco che si desidera che PowerShell controlli per gli errori. Questo è il blocco con gli script originali che potrebbero restituire un errore di terminazione.

Quando si verifica un errore nel blocco Try, PowerShell salva l'errore nella variabile automatica $Error (ne parleremo più avanti).



D'altra parte, t lui prendere dichiarazione di PowerShell Prova a prendere block gestisce gli errori generati nel blocco try. Puoi anche specificare i tipi di errori che vengono gestiti all'interno di Prendere blocco di istruzioni.



Il Infine block può essere utilizzato per liberare risorse che non sono più necessarie allo script.

Tipi comuni di errori di eccezione in PowerShell Prova a prendere

Tipi di errori in PowerShell Prova Catch

Puoi gestire diversi tipi di errori in un blocco PowerShell Try Catch. Ad esempio, puoi gestire errori specifici.

Inoltre, puoi gestire messaggi di errore generici. Tuttavia, per gestire tipi specifici di errori, è necessario conoscere il tipo di errore.

più avanti in questa guida imparerai che i messaggi di errore vengono salvati nella variabile automatica $error. Inoltre, gli errori possono essere salvati anche nella variabile della pipeline $_.

Inoltre, gli errori salvati nella variabile automatica $error vengono salvati in un array. Per aiutare a spiegare questo, eseguiamo un comando che restituisce un messaggio di errore finale:

Per cancellare tutti gli errori precedentemente salvati nel file $ errore variabile automatica, prima di eseguire il comando seguente, innanzitutto esegui $errore.Cancella() comando. |_+_| Non esiste un registro eventi chiamato Systerr, quindi il comando nel blocco Try genererà un messaggio di errore.

Sorprendentemente, il comando non ha visualizzato alcun messaggio di errore. Allora, cosa è successo al messaggio di errore?

mostra i processi di tutti gli utenti

Viene salvato nella variabile automatica $error! Per visualizzare l'errore dell'ultimo comando, salvato nella variabile $error, eseguire il comando...

|_+_|

Il risultato del comando mostra i dettagli dell'errore salvati nella variabile automatica $error. Le informazioni sull'errore hanno una sezione chiamata FullyQualifiedErrorId .

Per questo errore specifico, il FullyQualifiedErrorId ha due serie di informazioni – System.InvalidOperationException e Microsoft.PowerShell.Commands.GetEventLogCommand .

Le informazioni che ci interessano sono System.InvalidOperationException . Questo è un tipo di errore che puoi prendere nel blocco Prova Catch di PowerShell.

Per ottenere il nome di questa eccezione di PowerShell, eseguire il comando seguente:

|_+_|

Eccolo, System.InvalidOperationException !

Nelle prossime sottosezioni, parlerò degli errori comuni di PowerShell Try Catch Exception.

PowerShell Prova a catturare CommandNotFoundException Errore

Se esegui un comando che non esiste in PowerShell o nel prompt dei comandi di Microsoft, riceverai un messaggio di errore. Ad esempio, se esegui il Prendi il file comando, riceverai un messaggio di errore perché questo comando non è un cmdlet di PowerShell valido.

Ecco uno screenshot del risultato del comando in PowerShell...

PowerShell Prova a catturare l'errore CommandNotFoundException

Come puoi vedere dallo screenshot, il tipo di eccezione (FullyQualifiedErrorId ) è CommandNotFoundException .

Poiché si tratta di un errore finale, interromperà il proseguimento dello script. Per impedire a questo errore di terminare lo script, avvolgi il comando in a Prova a prendere bloccare.

Se avvolgiamo questo errore in un blocco PowerShell Try Catch, PowerShell eliminerà l'errore. Inoltre, impedirà di terminare lo script.

Tuttavia, anche se l'errore viene eliminato, viene salvato nella variabile $error. Come al solito, prima di eseguire il comando seguente, cancella gli errori salvati nella variabile $error.

|_+_|

Se desideri eseguire il comando in PowerShell anziché in PowerShell ISE, digita i comandi in un'unica riga come mostrato di seguito:

|_+_|

Quindi, per visualizzare l'errore, eseguire...

|_+_|

Come accennato nell'introduzione principale a questa sezione, per visualizzare l'ID eccezione per questo errore, eseguire il comando seguente:

|_+_|

Il nome completo dell'eccezione è System.Management.Automation.CommandNotFoundException .

PowerShell Prova a catturare ManagementObjectNotFoundException Errore

Quando esegui un comando in una sessione PS remota con le informazioni errate, PowerShell restituisce a ManagementObjectNotFoundException errore.

Uno scenario tipico è quando ci si connette a Office 365 con PowerShell. Quindi, esegui il comando Get-User ma fornisci l'utente sbagliato identità .

PowerShell Prova a catturare l'errore ManagementObjectNotFoundException

Per rilevare questo errore con PowerShell Try Catch, utilizzare un comando simile a quello seguente:

|_+_| Cattura il ManagementObjectNotFoundException errore con PowerShell Try, Catch è particolarmente complicato. Devi usare il ErrorAzione parametro e specificare Fermare . In caso contrario, anche con Try, Catch, l'errore verrà comunque visualizzato.

Infine, per ottenere il nome dell'eccezione, utilizzare il comando seguente:

|_+_|

Il comando restituisce il tipo di eccezione come System.Management.Automation.RemoteException . Allora, cos'è ManagementObjectNotFoundException ?

ManagementObjectNotFoundException è il motivo dell'eccezione come confermato dal comando seguente:

|_+_|

PowerShell Prova a catturare UnauthorizedAccessException Errore

Un altro errore di eccezione di PowerShell comune è UnauthorizedAccessException . Questo tipo di errore viene generato quando si tenta di accedere a un elemento per il quale non si dispone almeno di un'autorizzazione di lettura.

Per illustrare questo esempio, ho negato agli utenti autenticati l'accesso a un file specifico sul mio computer.

PowerShell Prova a rilevare l'errore UnauthorizedAccessException

Ora, se provo ad accedere al file con il comando Get-Content, ricevo un messaggio di accesso negato.

come eliminare i ruoli discord
|_+_|

Per interrompere la visualizzazione di questo errore, eseguire il comando all'interno del blocco PowerShell Try Catch come mostrato di seguito...

|_+_|

Sfortunatamente, il comando sopra non interrompe la visualizzazione dell'errore. Il motivo è che non è un errore finale.

Per interrompere la visualizzazione dell'errore, includere il file ErrorAzione parametro e specificare Fermare .

|_+_|

Ora, il comando elimina l'errore. Per visualizzare il tipo di eccezione, eseguire il comando seguente...

|_+_|

Il tipo di eccezione è System.UnauthorizedAccessException .

Esistono più tipi di errori di eccezione rispetto a quelli trattati in questa sezione. Ho trattato solo i tipi più comuni di eccezioni.

Come acquisire eccezioni specifiche con PowerShell Prova Catch

Come acquisire eccezioni specifiche con PowerShell Prova Catch

L'ultima sezione ha discusso le eccezioni comuni di PowerShell e come trovare il tipo di eccezione. Questa sezione tratterà come utilizzare tali informazioni per acquisire tipi specifici di messaggi di errore.

Nella sezione della sintassi di questa guida, ho detto che la sintassi generale di PowerShell Try Catch Finalmente è...

|_+_|

Nel blocco catch della sintassi, puoi vedere il [tipo di errore]. Qui è dove specifichi il tipo di errore che vuoi intercettare in questo blocco.

Ad esempio, per rilevare gli errori UnauthorizedAccessException, utilizzare le istruzioni seguenti...

|_+_|

Per eseguire il comando in PowerShell, specifica le istruzioni in una singola riga. La prima parte dell'istruzione – $error.Clear() – cancella tutti gli errori salvati nella variabile $error.

|_+_|

Come aggiungere più Prendere Blocchi in un PowerShell Prova a prendere Dichiarazione

Nell'introduzione di questa sezione, ti ho mostrato come catturare un tipo specifico di eccezione nel file Prendere bloccare. È possibile specificare più

Ecco un esempio...

|_+_|

In questo esempio, il primo prendere block gestisce i tipi di eccezioni specificati. Inoltre, il secondo prendere block handle gestisce errori generici.

Come estrarre l'eccezione di errore con PowerShell Prova Catch

L'ultima sottosezione ha spiegato come specificare più blocchi catch per gestire diversi tipi di eccezioni. In questa sottosezione imparerai come estrarre i dettagli dell'errore in un'eccezione.

Per illustrare questo, userò un esempio che ho usato in precedenza. Esegui questa istruzione di PowerShell in PowerShell.

|_+_|

Ora esegui l'errore $ da solo...

|_+_|

Sebbene nella variabile $error vengano salvate più informazioni, il messaggio di errore effettivo è evidenziato nella schermata seguente.

Come estrarre i dettagli di errore con PowerShell Prova Catch

Se desideri registrare questo errore in un file di testo, devi solo registrare i dettagli dell'errore effettivo. Per estrarre questo errore, utilizzare il comando seguente:

|_+_|

Il comando estrae il messaggio di errore effettivo L'accesso al percorso 'D:PS-Tutorialfolder-names.txt' è negato.

È possibile scrivere questo messaggio di errore in un file di registro includendo a Out-file comando nel blocco Catch.

|_+_| Ho incluso il Aggiungere parametro nel Out-file comando per consentire la registrazione di più voci senza sovrascrivere le voci precedenti.

Per rendere più facile la comprensione dell'ultimo comando, lo riscriverò nel formato dello script qui sotto...

|_+_|

Come includere A Infine Blocca su PowerShell Prova a prendere Dichiarazione

Come includere un blocco finale in PowerShell Prova l'istruzione Catch

Puoi includere un Infine blocco a PowerShell Prova a prendere Dichiarazione. La sintassi è

|_+_|

Il finalmente block può essere utilizzato per liberare risorse che non sono più necessarie allo script.

Un blocco Infine viene eseguito anche se si utilizza CTRL+C per interrompere lo script. Il blocco verrà eseguito anche se una parola chiave Exit interrompe lo script all'interno di un blocco Catch.

Nell'ultimo esempio, avevo l'istruzione che scrive il registro degli errori in un file di testo nel file Prendere bloccare. Tuttavia, il posto migliore per avere quella dichiarazione è in a Infine bloccare.

Vedi lo script modificato di seguito...

come bloccare un subreddit sull'app
|_+_|

Ulteriori informazioni utili su PowerShell Prova Catch

Altre informazioni importanti su PowerShell Prova

In questa sezione condividerò alcune semplici ma utili informazioni su PowerShell Try Catch.

Come cancellare PowerShell Prova a catturare la variabile automatica $ Error

La variabile automatica $error ha a Chiaro Metodo. È possibile utilizzare questo metodo per cancellare tutti gli errori salvati nella variabile automatica $error.

Per cancellare tutti gli errori salvati nella variabile automatica $error per la sessione di PowerShell corrente, eseguire il comando seguente.

|_+_|

Come visualizzare un messaggio di errore personalizzato in PowerShell Prova Catch Block

Per visualizzare un messaggio di errore personalizzato in un PowerShell Try Catch Block, usa la parola Throw. Ecco un esempio...

|_+_|

Ecco il risultato di questo script in PowerShell ISE.

Come visualizzare un messaggio di errore personalizzato in PowerShell Prova Catch Block

Come ottenere informazioni sulla categoria di errore in PowerShell Prova Catch

La variabile automatica $error ha una proprietà denominata CategoryInfo. Per visualizzare questa proprietà e altre proprietà e metodi, eseguire il comando seguente...

|_+_|

Viene chiamata una delle proprietà restituite dall'ultimo comando Informazioni sulla categoria .

Per accedere a queste informazioni, eseguire il comando seguente.

|_+_|

Questo comando restituisce più sottoproprietà.

Come ottenere informazioni sulla categoria di errore in PowerShell Prova Catch

È possibile accedere a ciascuna di queste sottoproprietà aggiungendo il nome delle sottoproprietà dopo un periodo. Ad esempio, per visualizzare le sottoproprietà di Reason, eseguire il comando seguente.

|_+_|

Come utilizzare Write-Host per visualizzare i messaggi di errore in PowerShell Prova Catch

Come la proprietà CategoryInfo nell'ultima sottosezione, anche la variabile automatica $error ha una proprietà chiamata Eccezione . Per visualizzare l'eccezione in un errore, eseguire il comando seguente:

|_+_|

Sfortunatamente, se si tenta di visualizzare queste informazioni con il comando Write-Host, non funziona come previsto.

|_+_|

Ecco il risultato di questo comando in PowerShell...

Come utilizzare Write-Host per visualizzare i messaggi di errore in PowerShell Prova Catch

Come puoi vedere, il comando mostra un sacco di altre informazioni. La buona notizia è che $errore.eccezione ha un'altra proprietà chiamata Messaggio .

Puoi chiamare questa sottoproprietà aggiungendola a $errore.eccezione , come questo…

|_+_|

Inoltre, puoi usare Scrivi-Host comando per visualizzare queste informazioni di errore...

|_+_|

L'ultimo comando ora mostra il messaggio di errore effettivo...

Tranne che c'è un motivo specifico per l'uso Scrivi-Host come mostrato nell'ultimo comando, puoi semplicemente visualizzare lo stesso messaggio di errore con $errore.eccezione comando.

Come creare una tabella hash in un PowerShell Prova Catch Block

Esistono due modi comuni per creare a Tabella hash di PowerShell in un blocco Try Catch.

  1. Puoi creare una tabella hash con più coppie chiave/valore all'interno del blocco Try
  2. In alternativa, puoi creare una singola tabella hash chiave/valore con Chiave fuori da Prova Catc h e il valore all'interno del Prova Catc blocco h.

Ecco un esempio del primo metodo...

|_+_|

Come puoi vedere l'hattable è all'interno del Prova Catc blocco h…

D'altra parte, puoi creare una singola chiave hashtable con il valore definito all'interno di a Prova Catc blocco h. Ecco un esempio...

|_+_|

Per confermare che l'ultimo script produce una tabella hash di PowerShell, dopo aver eseguito lo script, ho chiamato i valori salvati nella variabile $hashtable.

Come puoi vedere dal risultato dell'ultimo comando, ha una coppia Nome/Valore!

PowerShell Prova Esempi di cattura

PowerShell Prova Esempi di cattura

In questa sezione finale, tratterò più esempi dell'applicazione di PowerShell Try Catch.

Come usare PowerShell Prova a prendere Con Get-Childitem

Il comando Get-Childitem può restituire più errori. Per illustrare i due errori comuni, userò i due comandi seguenti:

|_+_|

Il percorso corretto del file di testo utilizzato nell'ultimo comando è D:PS-Tutorialfilelist.txt.

editor di immagini Android con livelli

Tuttavia, nel primo comando ho incluso uno spazio dopo D:PS-Tutorial. Ciò ha provocato un errore (determineremo i dettagli dell'errore a breve).

Inoltre, nel secondo comando, ho specificato il percorso corretto ma ho utilizzato il nome file sbagliato. Ciò ha provocato un errore.

|_+_| Come utilizzare PowerShell Prova a catturare con Get-Childitem

Andando avanti, per ottenere maggiori informazioni su questi errori, eseguirò i comandi in un PowerShell Prova a prendere bloccare.

|_+_|

Il nostro primo compito è determinare i tipi di errore restituiti dai comandi. Per ottenere queste informazioni, esegui i comandi seguenti...

|_+_|

Ecco i risultati dei comandi...

Come utilizzare PowerShell Prova a catturare gli errori Get-WMIObject con Export-csvGli errori salvati nella variabile automatica $error vengono archiviati in una matrice di PowerShell. Si accede a ogni oggetto nell'array aggiungendo un [0], [1] alla fine dell'array. 0 rappresenta il primo elemento nell'array mentre 1 rappresenta il secondo elemento e così via.

Torna a ottenere maggiori informazioni sugli errori generati da Get-Childitem comando, in base ai tipi di errore, possiamo modificare il nostro blocco Try Catch per catturare questi 2 tipi di errori...

|_+_|

Il nostro secondo compito è visualizzare i messaggi di errore effettivi. Questo comando farà il lavoro:

|_+_|

Il comando visualizza i due messaggi di errore...

Come usare PowerShell Prova a prendere Per esportare gli errori Get-WMIObject con Export-csv

In questa sottosezione, esporterò gli errori generati durante l'esecuzione Get-WMIObject su un computer remoto in un file CSV con estensione Esporta-csv comando.

Innanzitutto, vediamo i dettagli dell'errore generati quando provi a connetterti a un computer remoto offline con Get-WMIObject . Per illustrare questo esegui il comando seguente ...

|_+_|

Il comando ha generato un messaggio di errore perché Computer non è un nome PC valido.

Come rilevare gli errori di processo di get con PowerShell Prova l'istruzione Catch

Andando avanti, per gestire l'errore, eseguirò il comando all'interno del file Provare blocco di a Prova a prendere dichiarazione.

|_+_|

Nella prima riga del Provare blocco, ho definito la variabile $ComputerName. Quindi, nella seconda riga, ho eseguito il Get-WmiObject comando.

Inoltre, nel Prendere blocco, ho creato i dettagli dell'errore e l'ho esportato in un file CSV con Esporta-csv .

s7 bordo rallentatore

Ecco una spiegazione dettagliata dello script nel file Provare bloccare:

  1. Nella riga 1, ho creato una variabile $path che specifica dove voglio salvare il file CSV
  2. Quindi, nella riga 2 ho usato il comando Get-Date per creare un nome file per il file CSV. Il nome del file è nel formato, aaaaMMgg_HHmmss.csv
  3. Nella riga 3, ho creato un oggetto vuoto salvato in una variabile chiamata $data
  4. Quindi, nella riga 4 ho aggiunto la colonna 'Nome computer' nell'oggetto che ho creato nella riga 3. La colonna prende la variabile $ComputerName
  5. Nella riga 5, ho aggiunto il volume 'Messaggio di errore' che salverà i messaggi di errore, $messaggio.errore.eccezione
  6. Quindi, nella riga 6, ho creato una variabile $csvfilepath che combina le variabili $path e $csvfilename per creare un percorso completo del file CSV
  7. Infine, nella riga 7, ho reindirizzato le informazioni salvate nella variabile $data ($ComputerName e $error.Exception.Message) in Esporta-csv e salvato il file in $csvfilepath
Il Nessuna informazione sul tipo parametro nel comando Export-csv rimuove le informazioni sul tipo. Per saperne di più, leggi la nostra guida Powershell NoTypeInformation: applicazioni ed esempi

Lo screenshot qui sotto mostra il CSV creato dallo script...

Come rilevare gli errori di processo di get con PowerShell Prova a prendere Dichiarazione

Se esegui il comando Get-Process con un ID processo che non esiste, restituirà a Microsoft.PowerShell.Commands.ProcessCommandException errore.

Per acquisire questo tipo specifico di eccezione, eseguire un comando simile a quello seguente:

|_+_|

Ecco il risultato dello script in PowerShell ISE.

In alternativa, puoi definire un messaggio di errore personalizzato modificando lo script come mostrato di seguito...

|_+_|

Ora lo script restituisce il messaggio di errore personalizzato...

Come rilevare gli errori di Get-Mailbox con PowerShell Prova a prendere Dichiarazione

Se ti connetti a Office 365 PowerShell ed esegui il Get-Mailbox contro un utente che non esiste, riceverai un messaggio di errore. Alcuni utenti hanno segnalato di avere problemi nell'acquisizione del messaggio di errore Get-Mailbox comando.

Per testare questo scenario, dopo esserti connesso al ns Account Office 365 tramite PowerShell, ho eseguito lo script seguente:

|_+_| L'utente Pio non esiste nel nostro account Office 365.

Lo script ha restituito il messaggio di errore Impossibile eseguire l'operazione perché non è stato possibile trovare l'oggetto 'Pius' su 'AM6PR05A05DC002.EURPR05A005.PROD.OUTLOOK.COM '.

Ecco lo screenshot...

Tuttavia, se Prova a prendere rileva l'errore, prova ad aggiungere il tipo di eccezione come mostrato nel comando modificato di seguito:

|_+_|

Ecco fatto: la nostra guida completa e aggiornata su PowerShell Prova Catch Final ly! Spero che tu l'abbia trovato utile?

Se l'hai trovato utile, vota gentilmente sì alla Domanda utile di questo post di seguito.

In alternativa, puoi fare una domanda, lasciare un commento o fornire più feedback con il modulo Lascia un commento che si trova alla fine di questa pagina.

Infine, per altre S Zone di PowerShell tech, visita la nostra pagina della guida di Windows PowerShell. Potresti anche trovare molto utile la nostra pagina Lavoro dalla home.

Riferimenti e ulteriori letture

  1. Informazioni su Prova a catturare finalmente
  2. A proposito di Trappola
  3. Array di PowerShell e Aggiungi all'array: applicazioni ed esempi
  4. Spiegazione di Powershell For Loop: sintassi ed esempi