2012-08-15 29 views
12

Trong một kịch bản PS tự động hoá một số nhiệm vụ SVN tôi có chức năng sau:Làm thế nào để ngăn chặn đầu ra stderr trong Powershell?

function SvnUrlExists($url) 
{ 
    svn info $url | out-null 2>&1 
    return $? 
} 

Kể từ khi công khai này kiểm tra xem một số URL kho SVN tồn tại, tôi không quan tâm chút nào trong bất kỳ đầu ra lỗi. Tuy nhiên, bất chấp tất cả mọi thứ tôi thấy về chuyển hướng stderr trong Powershell cho thấy 2>&1 để chuyển hướng nó vào stdout, này vẫn kết quả đầu ra một thông báo lỗi:

 
svn: warning: W170000: URL 'blahblah' non-existent in revision 26762 

svn: E200009: Could not display info for all targets because some targets don't exist 

Thật không may, điều này messes nặng lên đầu ra của kịch bản của tôi.

Tôi đang làm gì sai và làm cách nào để loại bỏ đầu ra lỗi này?

Trả lời

15

Chỉ trong trường hợp ai đó Googles với các điều kiện tương tự như tôi đã làm:

Sau khi tôi đã được đập trán tôi chống lại điều này trong nhiều giờ, dĩ nhiên là tôi tìm thấy giải pháp trong vòng vài phút sau khi đăng câu hỏi ở đây:

svn info $url 2>&1 | out-null 

Điều này hoạt động như một sự quyến rũ.

+0

Ngoài ra, nếu bạn có một lệnh lớn hơn, bạn có thể bọc nó trong '$() | out-null' để có được hiệu ứng tương tự. Ví dụ: '$ (svn info $ url 2> &') | out-null'. Tôi làm điều này khi lệnh là rất dài, hoặc tôi cần phải phá vỡ nó trên một vài dòng trong một kịch bản. – Nick

+0

@Nick: Ah, cảm ơn. Tuy nhiên, nó sẽ không phải là '$ (svn info $ url) 2> & 1 | out-null'? (Lưu ý vị trí của '2> & 1'.) – sbi

+0

Oh wow, tôi hoàn toàn hiểu sai bài đăng của bạn. Có, nó phải là '$ (svn info $ url) | out-null'. Nó phụ thuộc vào nơi bạn muốn kiểm tra lỗi xảy ra cho '2> & 1'. Tôi không thể nói mà không thử nghiệm nó, nhưng tôi không nghĩ rằng nó sẽ quan trọng nếu nó là bên trong ')' hoặc bên ngoài. Bạn có thể thực sự có thể chỉ để lại '2> & 1' hoàn toàn, như tôi đã nói, mà không thử nghiệm tôi không thể chắc chắn. – Nick

3

bình chọn câu trả lời này tạo ra một lỗi cho tôi. Giải pháp rốt cuộc là như sau:

cmd /c "MyProgram MyArguments 2>&1" | Out-Null 
+1

Việc chuyển hướng stderr sang stdout sẽ vẫn tạo ra lỗi và dừng thực thi tập lệnh nếu bạn có $ ErrorActionPreference = 'Stop'. Nhưng lỗi sẽ không xảy ra nếu bạn không chuyển hướng stderr đến stdout. Kỳ dị! –

+0

@ RafałKłys: Thật kỳ lạ, thật vậy; nó là một _bug_: xem https://github.com/PowerShell/PowerShell/issues/4002 – mklement0

8

Nếu bạn muốn ngăn chặn sử dụng chỉ stderr:

svn info $url 2>$null 
Các vấn đề liên quan