$ LASTEXITCODE è strettamente riservato ai programmi della riga di comando per restituire il loro stato. I cmdlet incorporati in PS, come Remove-item, restituiscono i loro errori in un massimo di 3 modi. Per gli avvertimenti, scrivono messaggi (o altri oggetti .NET) sul "flusso di avviso". In PSv3 c'è un modo semplice per reindirizzare quello stream a un file: cmdlet blah blah blah 3>warning.out
. Il secondo è tramite il flusso di errori. Quel flusso può essere reindirizzato come ... 2>error.out
, o più tipicamente gli errori vengono catturati con try/catch o trap, o scritti in una variabile con il parametro -ErrorVariable (vedi help about_commonparameters
). Il terzo modo è che gli errori vengano "lanciati". Se non viene rilevato (try/catch o trap), un errore generato causerà la fine dello script. Gli errori generati generalmente sono sottoclassi della classe .NET system.Management.Automation.ErrorRecord
. Un ErrorRecord fornisce molte più informazioni su un errore rispetto a un codice di ritorno.
Se l'elemento di rimozione non riesce a causa di un errore di file non trovato, scrive uno System.Management.Automation.ItemNotFoundException
nel flusso di errori. Usando un try/catch puoi filtrare per quell'errore specifico o altri errori specifici da remove-item. Se stai semplicemente digitando i comandi PS dalla riga di comando, puoi inserire $error[0]|select-object *
per ottenere molte informazioni sull'ultimo errore.
Si potrebbe fare questo:
try {
Remove-Item -Recurse -Force C:\users\bkp 2>&1
} catch {
# oops remove-item failed. Write warning then quit
# replace the following with what you want to do
write-warning "Remove-item encounter error: $_"
return # script failed
}
fonte
2013-07-04 03:53:40
Si può semplicemente controllare la variabile $ error. Questo contiene tutti gli errori incontrati nella tua sessione, fino a un certo punto in quanto ha un limite sull'allocazione della memoria, credo. –