2009-06-19 2 views
7

PowerShell è un mix strano di .bat e .NET. In .bat, si controlla l'output errorlevel e stderr dai comandi. In .NET, si rilevano le eccezioni.Qual è il modo corretto di gestire gli errori in PowerShell?

In che modo i cmdlet restituiscono errori? Lanciano eccezioni quando falliscono o impostano $? anziché? È configurabile?

Suppongo anche che le funzioni .NET che invoco in PowerShell generino sempre eccezioni e non vengano automaticamente catturate dalla shell e convertite in errori. È corretto?

Forse quello che dovrei davvero chiedere è: qual è un buon articolo che riguarda tutto questo? Sembra che molti ingegneri come me che hanno esperienza in cmd .bat e .NET si chiedano esattamente come dovremmo fare le cose in questo nuovo mondo di Posh.

risposta

9

Per i singoli cmdlet, c'è un parametro chiamato -ErrorAction. I valori possibili sono SilentlyContinue, Stop, Continue o Inquire. È inoltre possibile specificare una variabile globale denominata $ errorpreference in una qualsiasi di queste opzioni.

In V1, è possibile utilizzare la parola chiave trap. C'è un pretty good, concise article che descrive le differenze chiave tra i trap e la sintassi try/catch/finally che è stata aggiunta in V2.

Ecco un breve esempio di utilizzo di dichiarazioni trappola, il primo è per un tipo specif d'eccezione e la seconda è una cattura generica tutto trap di errore

trap {"Other terminating error trapped" } 
trap [System.Management.Automation.CommandNotFoundException] 
     {"Command error trapped"} 
1/$null 
+0

Esattamente quello di cui avevo bisogno, grazie mille! – scobi

+0

Il nome della variabile globale è $ ErrorActionPreference, non $ errorpreference: http://blogs.msdn.com/powershell/archive/2008/04/10/erroraction-update.aspx –

0

Ritengo che Posh sia tutto .Net. La maggior parte dei concetti che funzionano in .Net dovrebbero funzionare in Posh.

Per la gestione degli errori, è possibile utilizzare Try..catch. È anche possibile "trap" errori e specificare il proprio insieme di istruzioni da eseguire in caso di errore.

Consiglio vivamente l'aiuto in-built:

Get-Help about_Errors 
Get-Help about_Trap 
+0

Così forse è stato rimosso in V2CTP3 ma non c'è about_errors o about_trap. E la tua risposta riassume la mia domanda. Posh è .NET-y, so di try-catch, ecc., Ma in realtà non aiuta a rispondere a nessuna delle domande che ho. – scobi