2009-09-08 40 views
9

我有一個運行外部exe的腳本。當該exe失敗(將errorlevel設置爲1)時,powershell腳本失敗。在Windows中忽略errorlevel!= 0 Powershell

我運行curl.exe並獲得這樣的:+ CategoryInfo:NotSpecified:(%合計%...時間電流:字符串)[]的RemoteException + FullyQualifiedErrorId:NativeCommandError

我怎能無視/捕獲外部EXE的失敗並繼續我的腳本?

+0

您確定它是一個外部EXE返回導致PowerShell出錯的錯誤代碼嗎?這通常不會在PowerShell中引發錯誤。事實上,您必須竭盡全力將代表錯誤的$ LASTEXITCODE轉換爲PowerShell錯誤。 –

+0

你至少可以發佈一些代碼嗎?在這種情況下,失敗通常不是默認行爲。 – Joey

+0

我運行curl.exe並獲得這樣的: + CategoryInfo:NotSpecified:(%合計%...時間電流:字符串)[],RemoteException的 + FullyQualifiedErrorId:NativeCommandError – ripper234

回答

17

這與EXE返回的退出代碼沒有任何關係。當EXE寫入標準錯誤但僅在ISE內或遠程處理或使用後臺作業時,會生成錯誤。寫入stderr的exe不會而是從常規PowerShell命令提示符中生成錯誤。我不確定爲什麼會出現這種情況,但如果我可以獲得更多信息,我會更新這篇文章。

+0

在shell中,似乎stderr會直接進入控制檯。雖然如果你將它重新路由到標準輸出(2>&1),它會將這些消息包裝在ErrorRecords中。也許PowerShell團隊認爲ISE是一種所有錯誤應該更明顯的環境? – JasonMArcher

+0

在我的回答下面的進一步詳細http://stackoverflow.com/a/11826589/284795 –

+0

解決了許多小時的挫折,謝謝 –

1

我正在通過powershell_ise(一個IDE)運行腳本,我相信這是導致問題的原因。通過PowerShell本身運行它似乎工作。

11

實際上,應用程序運行正常 - Powershell在報告錯誤時出錯。

當應用程序打印到標準錯誤時,Powershell有時會斷定應用程序失敗。這實際上是由Powershell開發人員做出的設計決定。 Imho這是一個錯誤,因爲許多可靠的應用程序(例如curl)會在正常操作過程中將有用的信息打印到標準錯誤。其結果是,Powershell只能與其他Powershell腳本搭配使用,並且不能依賴於與其他應用程序的互操作。


在此線程的其他讀者有困難再現的行爲,因爲PowerShell的不一致實現它。 NativeCommandError是否發生取決於標準錯誤是如何重定向的(因此該錯誤發生在vanilla Powershell ISE中,但不是vanilla Powershell)。無論您對第一段中的設計決定有何看法,不一致的實現是肯定的Powershell錯誤$LastExitCode=0 but $?=False in PowerShell. Redirecting stderr to stdout gives NativeCommandError

+0

這是重要的信息。我已經塞滿了這個問題,一個以前工作的腳本 - 幾個月 - 然後不斷失敗。我會在關於它的自述文件中添加一個註釋。感謝您的詳細解釋 –