2012-08-15 18 views
12

W skrypcie PS automatyzację niektórych zadań SVN Mam następującą funkcję:Jak tłumić wyjście stderr w Powershell?

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

Od tego wyraźnie sprawdza, czy niektóre repozytorium SVN URL istnieje, nie jestem zainteresowany w ogóle w każdym wyjściu błędu. Jednak mimo wszystko znalazłem o przekierowanie stderr w PowerShell sugerując 2>&1 przekierować go do stdout, to nadal wysyła komunikat o błędzie:

 
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 

Niestety, ten poważnie bałagan wyjścia mojego scenariusza.

Co robię źle, i jak powinienem pomijać ten wynik błędu?

Odpowiedz

15

wszelki wypadek ktoś google na podobnych warunkach jak ja:

Po I zostały walić czołem to przez wiele godzin, oczywiście znalazłem rozwiązanie w ciągu kilku minut po zaksięgowaniu pytanie tutaj:

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

Działa to jak urok.

+0

Ponadto, jeśli masz większy polecenia można zawinąć go w '$() | out-null', aby uzyskać ten sam efekt. Na przykład: '$ (svn info $ url 2> &') | out-null ". Robię to, gdy polecenie jest bardzo długie, lub muszę je rozbić na kilka linii w skrypcie. – Nick

+0

@Nick: Ah, dzięki. Jednak nie musi to być '$ (svn info $ url) 2> & 1 | out-null'? (Zauważ umieszczenie '2> & 1'.) – sbi

+0

Oh wow, całkowicie błędnie przeczytałem twój post. Tak, powinno to być '$ (svn info $ url) | out-null ". Zależy to od tego, gdzie ma nastąpić sprawdzanie błędów dla '2> i 1'. Nie mogę powiedzieć bez testowania tego, ale nie sądzę, że powinno to mieć znaczenie, jeśli znajduje się wewnątrz ')' lub na zewnątrz. Możliwe, że będziesz w stanie całkowicie opuścić '2> i 1', tak jak powiedziałem, bez testowania, nie jestem pewien. – Nick

3

Wziął odpowiedź generuje błąd dla mnie. Rozwiązanie zakończył się następujące elementy:

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

Przekierowanie stderr do stdout nadal generuje błąd i zatrzymuje wykonywanie skryptu, jeśli masz $ ErrorActionPreference = 'Stop'. Ale błąd nie nastąpi, jeśli nie przekierujesz stderr do stdout. Dziwne! –

+0

@ RafałKłys: Weird, indeed; to jest _bug_: zobacz https://github.com/PowerShell/PowerShell/issues/4002 – mklement0

8

Jeśli chcesz stłumić korzystanie tylko stderr:

svn info $url 2>$null 
Powiązane problemy