2009-09-08 11 views
9

Ho uno script che esegue un exe esterno. Quando questo errore fallisce (imposta errorlevel su 1), lo script di PowerShell fallisce.Ignorare un errorlevel! = 0 in Windows PowerShell

Io corro curl.exe e ottenere questo: + CategoryInfo: NotSpecified: (% Totale% ... Ora corrente: String) [], RemoteException + FullyQualifiedErrorId: NativeCommandError

Come posso ignorare/catch il fallimento dell'exe esterno e continua con il mio script?

+0

Sei sicuro che sia un EXE esterno che restituisce un codice di errore che sta causando l'errore di PowerShell? Normalmente non viene generato un errore in PowerShell. In realtà, devi fare di tutto per convertire un $ LASTEXITCODE che rappresenta un errore in un errore di PowerShell. –

+0

Potresti inserire almeno del codice? In genere, il fallimento non è il comportamento predefinito in quel caso. – Joey

+0

Io corro curl.exe e ottenere questo: + CategoryInfo: NotSpecified: (% Totale% ... Ora corrente: String) [], RemoteException + FullyQualifiedErrorId: NativeCommandError – ripper234

risposta

17

Questo non ha nulla a che fare con il codice di uscita restituito dall'EXE. Viene generato un errore quando un EXE scrive su stderr ma solo all'interno di ISE o quando si esegue il servizio remoto o si utilizzano lavori in background. Un exe che scrive su stderr fa non genera errori dal normale prompt dei comandi di PowerShell. Non sono sicuro del motivo per cui questo è il caso, ma se posso ottenere ulteriori informazioni su questo aggiornerò questo post.

+0

Nella shell sembra che stderr passi direttamente alla console. Anche se lo si reindirizza allo stdout (2> e 1), i messaggi verranno racchiusi in ErrorRecords.Forse il team di PowerShell ha deciso che ISE era il tipo di ambiente in cui tutti gli errori dovrebbero essere più evidenti? – JasonMArcher

+0

Ulteriori dettagli nella mia risposta qui sotto http://stackoverflow.com/a/11826589/284795 –

+0

Risolte molte ore di frustrazione, grazie –

1

Stavo eseguendo lo script tramite powershell_ise (un IDE), credo che questo sia ciò che ha causato i problemi. Eseguirlo attraverso Powershell sembra funzionare.

11

In realtà, l'applicazione ha funzionato correttamente - Powershell ha sbagliato a segnalare un errore.

Quando un'applicazione stampa su errore standard, Powershell a volte conclude che l'applicazione non è riuscita. Questa è in realtà una decisione progettuale presa dagli sviluppatori di Powershell. Questo è un errore, perché molte applicazioni affidabili (come ad esempio l'arricciatura) stampano informazioni utili a errori standard nel corso del normale funzionamento. La conseguenza è che Powershell funziona bene solo con altri script di Powershell e non può essere considerato affidabile per interagire con altre applicazioni.


Altri lettori in questa discussione hanno avuto difficoltà a riprodurre il comportamento in quanto Powershell lo implementa in modo incoerente. Se l'errore NativeCommandError si verifica dipende da come viene reindirizzato l'errore standard (di conseguenza l'errore si verifica in VANEL Powershell ISE ma non in Vanilla Powershell). Qualunque sia la tua opinione sulla decisione di progettazione nel primo paragrafo, l'implementazione incoerente è certa per un bug di PowerShell $LastExitCode=0 but $?=False in PowerShell. Redirecting stderr to stdout gives NativeCommandError

+0

Questa è un'informazione importante. Mi sono imbattuto in questo problema, con uno script che in precedenza funzionava - da alcuni mesi - e poi continuamente fallito. Inserirò una nota nel file readme a riguardo. Grazie per la spiegazione estesa –

Problemi correlati