2013-07-04 8 views
7

mio frammento è qualcosa di simile: \ BKP non esiste \ users:Come ottenere il codice di errore quando c'è un errore in PowerShell?

$msg=Remove-Item -Recurse -Force C:\users\bkp 2>&1 
if ($LASTEXITCODE -eq 1) 
{ 
    "Encountered error during Deleting the Folder. Error Message is $msg. Please check." >> $LogFile 
    exit 
} 

cartella C. Anche se $ msg mi dà il messaggio di errore $ LASTEXITCODE è ancora 0. Come posso catturare come bandiera?

+0

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. –

risposta

9

$ 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 
} 
+0

non imposta alcun flag di errore? –

+0

Sembra che tu voglia solo sapere se il comando ha funzionato o no? Tuttavia non è sempre solo una decisione si/no. Ad esempio puoi dire rimuovere-item per eliminare 10 file, ma finisce con l'eliminazione di 8, perché due file sono in uso da altri programmi. Considerate il successo o il fallimento? Penso che probabilmente vorrai usare try/catch (vedi help about_try) e se si verificano degli errori allora vuoi catturare l'errore e andare da lì. Modificherò la risposta per fornire un codice di esempio –

+2

'try..catch' non funziona, perché l'errore è non terminante. Devi aggiungere '-ErrorAction Stop' a' Remove-Item' per rendere l'errore catchable. –

12

È possibile utilizzare il $?automatic variable per determinare il risultato dell'ultimo comando. Se è necessario accedere all'errore effettivo, è possibile utilizzare la variabile automatica $Error. Il primo elemento nell'array è l'ultimo errore generato:

Remove-Item -Recurse -Force C:\users\bkp 2>&1 
if(-not $?) 
{ 
    $msg = $Error[0].Exception.Message 
    "Encountered error during Deleting the Folder. Error Message is $msg. Please check." >> $LogFile 
    exit 
} 
+0

Ottimo .. Fammi provare e tornare .. –

+1

Penso che sarebbe meglio aggiungere '-ErrorAction SilentlyContinue', in modo che se il cmdlet non fosse riuscito a causa non sarebbe terminato e saltare il se la dichiarazione. e il messaggio di errore non verrà stampato per console due volte. – Jackie

+0

@Jackie Sì, se l'OP vuole gestire tutti gli errori da solo. Dalla sua domanda iniziale, però, sta reindirizzando gli errori allo stream standard di output, quindi penso che voglia ancora vederli. –

Problemi correlati