Gestisci gli errori di PowerShell come un boss con questi suggerimenti

Come suggerisce il nome, PowerShell è molto più potente del prompt dei comandi di Windows standard. Con quel potere arriva una maggiore possibilità di errori confusi. Se la tua sceneggiatura fallisce improvvisamente, potresti non sapere da dove cominciare cercando cosa è andato storto. Qui è utile la gestione degli errori di PowerShell.
Se hai familiarità con altre lingue, probabilmente conosci le basi della gestione degli errori, ma ci sono alcuni aspetti specifici di PowerShell che devi conoscere. In PowerShell sono presenti quattro parti per la gestione degli errori: il parametro Azione errore, Blocchi Try / Catch, il parametro Variabile errore e la registrazione.
Errore di PowerShell nel modo più semplice
Il primo passo nella gestione degli errori di PowerShell è gestire qualcosa che blocca lo script nelle sue tracce. Se l'errore non influisce sul resto dello script, potrebbe essere meglio solo dire a PowerShell di ignorare gli errori e andare avanti.
D'altra parte, non è sempre chiaro quando un determinato cmdlet genera un errore di chiusura. Alcuni cmdlet restituiscono un errore ma non arrestano lo script. Questo potrebbe lasciarti in attesa che il tuo script venga completato mentre genera assurdità.
È qui che entra in gioco il parametro -ErrorAction . Lo si utilizza per forzare un cmdlet a gestire l'errore nel modo desiderato. Se si sta modificando uno script esistente, lo si aggiunge alla fine della riga del cmdlet.
Get-ChildItem -Path "~Documents*.jpg" -Recurse -ErrorAction Stop
Ovviamente, se si utilizza il cmdlet Get-ChildItem da solo, questo errore non fa molto per te. Tuttavia, se vuoi fare qualcosa con i dati, sarebbe bene interrompere lo script, quindi sai che la ricerca non è riuscita e perché. In alternativa, se si eseguono più ricerche, modificare il parametro da Stop a SilentlyContinue , quindi lo script continua se la ricerca non riesce. Se vuoi vedere qual è l'errore, puoi usare Continua come parametro.
Get-ChildItem -Path "~Documents*.jpg" -Recurse -ErrorAction SilentlyContinue
Se preferisci avere la possibilità di controllare cosa succede ogni volta che lo script viene eseguito, puoi cambiarlo in Inquire . Quando il cmdlet colpisce un intoppo, offre opzioni: Sì , Sì per tutti , Halt Command , Suspend o Help .
Questa opzione è un po 'più flessibile ma significa che gli errori fanno sì che lo script attenda l'input. Va bene se stai usando PowerShell per inviare un'e – mail o qualche altra semplice attività, ma potrebbe non essere qualcosa che desideri quando esegui un lungo processo durante la notte.
Errore di PowerShell nel modo più efficace
Il parametro ErrorAction risolve i tuoi errori in modo semplice. Tuttavia, se stai cercando un po 'più di controllo sugli errori, PowerShell ti copre ancora. Utilizzando Try / Catch , ora possiamo ramificare lo script quando i cmdlet restituiscono un errore.
Come suggerisce il nome, Try / Catch è composto da due parti. (Ne esiste tecnicamente un terzo, ma ci arriveremo tra un minuto.) Il primo è la sezione Prova . Eseguirai il tuo codice normale in questa sezione. Utilizzerai ancora il parametro -ErrorAction , ma può essere impostato solo come Stop . Questo flag garantisce che il cmdlet attivi il Catch, anche se non presenta un errore di terminazione.
Try{ Get-Process "Cortana" -ErrorAction Stop }
Try può anche impedire l'esecuzione di altri cmdlet se la ricerca non riesce. In questo caso, se si stavano inviando i risultati Get-Process a Stop-Process , una ricerca non riuscita impedisce l'esecuzione del secondo cmdlet.
Quindi, ora che hai creato un blocco try di cmdlet, cosa vuoi fare quando fallisce? Usando la metà Catch , lo definirai.
Catch{ Write-Host "Process Not Found" }
Come con il parametro ErrorAction , quando stai facendo qualcosa di un po 'più complesso Catch sarà utile per qualcosa di più che dare un errore di linguaggio semplice, specialmente quando stai facendo qualcosa di un po' più complesso . (Nell'esempio sopra, l'errore viene forzato utilizzando il nome dell'app e non il nome del processo.) Quindi assicurati di giocare con il blocco Try per creare una ricerca / azione che ti serve. È possibile utilizzare il blocco Catch per lo script per inviare un'e-mail in caso di errore.
La terza parte è utile se si desidera eseguire qualcosa indipendentemente dal fatto che il cmdlet abbia esito positivo o meno. Per questo, puoi usare il blocco Infine . Lo aggiungi dopo Try and Catch e registri quando termina una sezione del tuo script.
La variabile di errore e la registrazione
Lo script ora controlla il modo in cui gestisce gli errori e il modo in cui risponde ad essi. È possibile utilizzarlo come attività pianificata o almeno eseguirlo quando non si è alla propria scrivania. Tuttavia, come è possibile esaminare uno script non riuscito? Con il parametro -ErrorVariable gli errori del cmdlet scrivono in una variabile personalizzata.
Questa è un'alternativa alla variabile $ Error di sistema, che contiene tutti gli errori della sessione corrente.
Il cmdlet deve aumentare leggermente. Innanzitutto, definisci una variabile, come nell'esempio farà qualcosa come $ SearchError . Quando si chiama SearchError nel Parmeter ErrorVariable, non si utilizza il simbolo del dollaro.
Anche se stai chiamando una variabile che hai creato, a causa del modo in cui il parametro funziona, la chiami senza il simbolo del dollaro. Quindi aggiungilo alla fine della riga.
Get-ChildItem -Path "~Documents*.jpg" -Recurse -ErrorAction Continue -ErrorVariable SearchError
Se aggiungi un + davanti al nome della variabile, puoi aggiungerlo alla variabile anziché sostituirlo completamente. Questo ti dà lo stesso comportamento della variabile di errore globale. Invece, puoi usare questo output e Try / Catch per scrivere output personalizzati e timestamp.
Per farlo funzionare, crea un file di testo subito dopo aver impostato la variabile di errore. Farlo con il cmdlet New-Item . È possibile che si desideri utilizzare l
9;opzione Inquire per il parametro ErrorAction . Ciò consente di aggiungere un registro esistente in caso di errore del cmdlet New-Item .
$SearchLog = New-Item "~SearchLog.txt" -type file -ErrorAction Inquire
Ora, quando si crea il blocco Try / Catch , è possibile utilizzare Catch per accedere a un file di testo. Utilizzare Get-Date per creare il timestamp. La formattazione può essere complicata, quindi assicurati di copiarla dall'esempio.
Try{ Get-ChildItem -Path "~Documents*.jpg" -Recurse -ErrorAction Stop -ErrorVariable SearchError } Catch{ Add-Content -Path $SearchLog -Value "$(Get-Date -Format dd-MM-yy-hh_mm_ss) Files not found returned error: $SearchError" }
Ripeti l'operazione secondo necessità per tutti i cmdlet e ora avrai un bel registro di eventuali errori. Se si desidera tenere traccia delle cose eseguite correttamente, è possibile aggiungere un contenuto aggiuntivo simile alla fine del blocco Try .
Questa registrazione viene eseguita solo quando il cmdlet Try ha esito positivo. È quindi possibile registrare gli errori e i successi con i timestamp. La registrazione ora ti consente di sapere tutto ciò che il tuo script ha fatto, successo o fallimento.
PowerShell non è la tua unica opzione
Mentre PowerShell è uno strumento utile per molte attività di Windows, può essere difficile da imparare. Inoltre non è adatto a tutto. Se si esegue la manutenzione del sistema sul computer o si verifica l'integrità di un file , PowerShell è utile. D'altra parte, se stai cercando di eseguire uno script per scaricare file da Internet o un'attività più generale, hai altre opzioni.
Ad esempio, se provieni da un background Unix o Linux, potresti essere più a tuo agio usando la shell bash. Grazie al sottosistema Windows per Linux, ora puoi usare facilmente bash e altri strumenti Linux sul tuo computer Windows 10. Se ti sembra perfetto, non cercare oltre la nostra guida per far funzionare la shell bash su Windows 10 .
Leggi l'articolo completo: Gestisci gli errori di PowerShell come un boss con questi suggerimenti