2009-09-08 22 views
9

Tôi có một tập lệnh chạy một exe bên ngoài. Khi exe đó thất bại (đặt errorlevel thành 1), kịch bản lệnh PowerShell bị lỗi.Bỏ qua một errorlevel! = 0 trong Windows Powershell

Tôi đang chạy curl.exe và nhận được điều này: + CategoryInfo: NotSpecified: (% Tổng% ... Thời gian hiện tại: String) [], RemoteException + FullyQualifiedErrorId: NativeCommandError

Làm thế nào tôi có thể bỏ qua/catch sự thất bại của exe bên ngoài và tiếp tục với kịch bản của tôi?

+0

Bạn có chắc là một EXE bên ngoài trả lại mã lỗi gây ra lỗi PowerShell không? Điều đó thường không gây ra lỗi khi được ném trong PowerShell. Trong thực tế, bạn phải đi ra khỏi con đường của bạn để chuyển đổi một $ LASTEXITCODE đại diện cho một lỗi cho một lỗi PowerShell. –

+0

Bạn có thể đăng ít nhất một số mã không? Thông thường thất bại không phải là hành vi mặc định trong trường hợp đó. – Joey

+0

Tôi đang chạy curl.exe và nhận được này: + CategoryInfo: NotSpecified: (% Tổng% ... Thời gian hiện tại: String) [], RemoteException + FullyQualifiedErrorId: NativeCommandError – ripper234

Trả lời

17

Điều này không có bất kỳ điều gì liên quan đến mã thoát được trả về bởi EXE. Một lỗi được tạo ra khi một EXE ghi vào stderr nhưng chỉ trong ISE hoặc khi từ xa hoặc sử dụng các công việc nền. Một exe viết cho stderr không không tạo ra lỗi từ dấu nhắc lệnh PowerShell thông thường. Tôi không chắc chắn tại sao đây là trường hợp nhưng nếu tôi có thể nhận được một số thông tin thêm về điều này tôi sẽ cập nhật bài đăng này.

+0

Trong vỏ có vẻ như stderr đi ngay đến bàn điều khiển. Mặc dù nếu bạn định tuyến lại nó thành stdout (2> & 1), nó sẽ bao bọc các thông báo đó trong ErrorRecords.Có lẽ nhóm PowerShell đã quyết định rằng ISE là loại môi trường mà tất cả các lỗi nên đáng chú ý hơn? – JasonMArcher

+0

Các chi tiết khác trong câu trả lời của tôi dưới đây http://stackoverflow.com/a/11826589/284795 –

+0

Giải quyết nhiều giờ thất vọng, cảm ơn bạn –

1

Tôi đã chạy tập lệnh thông qua powershell_ise (một IDE), tôi tin rằng đây là nguyên nhân gây ra sự cố. Chạy nó thông qua Powershell chính nó dường như làm việc.

11

Thực ra, ứng dụng đã chạy tốt - Powershell bị nhầm lẫn khi báo cáo lỗi.

Khi một ứng dụng in ra lỗi chuẩn, Powershell đôi khi sẽ kết luận rằng ứng dụng không thành công. Đây thực sự là một quyết định thiết kế của các nhà phát triển Powershell. Imho đây là một sai lầm, bởi vì nhiều ứng dụng đáng tin cậy (chẳng hạn như curl) in thông tin hữu ích cho lỗi tiêu chuẩn trong quá trình hoạt động bình thường. Hậu quả là Powershell chỉ chơi tốt với các kịch bản Powershell khác, và không thể dựa vào để tương thích với các ứng dụng khác.


Những người đọc khác trong chủ đề này gặp khó khăn khi tái tạo hành vi vì Powershell thực hiện không nhất quán. Cho dù NativeCommandError xảy ra phụ thuộc vào cách lỗi tiêu chuẩn được chuyển hướng (như là hậu quả của lỗi xảy ra trong vanilla Powershell ISE nhưng không phải vanilla Powershell). Bất kể ý kiến ​​của bạn về quyết định thiết kế trong đoạn đầu tiên, việc triển khai không nhất quán là đối với một lỗi Powershell nhất định $LastExitCode=0 but $?=False in PowerShell. Redirecting stderr to stdout gives NativeCommandError

+0

Đây là thông tin quan trọng. Tôi đã nhồi nhét xung quanh với vấn đề này, với một kịch bản mà trước đó đã được làm việc - trong một vài tháng - và sau đó liên tục thất bại. Tôi sẽ ghi chú vào tập tin readme về nó. Cảm ơn bạn vì lời giải thích mở rộng –

Các vấn đề liên quan