2012-08-15 20 views
12

En una secuencia de comandos PS automatizando algunas tareas SVN tengo la siguiente función:¿Cómo suprimir la salida de stderr en Powershell?

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

Dado que este explícitamente comprueba si existe alguna URL del repositorio SVN, no me interesa en absoluto en cualquier salida de error. Sin embargo, a pesar de todo lo que encontré sobre la reorientación de stderr en Powershell sugiriendo 2>&1 para redirigirlo a stdout, esto todavía emite un mensaje de error:

 
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 

Desafortunadamente, esta meta la pata gravemente a la salida de mi guión.

¿Qué estoy haciendo mal y cómo debo suprimir este error de salida?

Respuesta

15

Sólo en caso de que alguien googles términos similares como lo hice:

Después de que he estado golpeando la frente en esto por horas, por supuesto, he encontrado la solución en cuestión de minutos después de la publicación de la pregunta aquí:

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

Esto funciona como un encanto.

+0

Además, si usted tiene una orden grande se puede envolver en '$() | out-null' para obtener el mismo efecto. Por ejemplo: '$ (svn info $ url 2> &') | out-null'. Hago esto cuando el comando es muy largo, o necesito dividirlo en unas pocas líneas en un script. – Nick

+0

@Nick: Ah, gracias. Sin embargo, no tendría que ser '$ (svn info $ url) 2> & 1 | fuera de nulo'? (Tenga en cuenta la ubicación de '2> & 1'.) – sbi

+0

Oh wow, leí completamente su publicación. Sí, debería ser '$ (svn info $ url) | out-null'. Depende de dónde desee que suceda la comprobación de errores para '2> & 1'. No puedo decir sin probarlo, pero no creo que debería importar si está dentro del ')' o afuera. En realidad, podrías dejar el '2> & 1' completamente, como dije, sin pruebas, no estoy seguro. – Nick

3

respuesta Votado genera un error para mí. Solución terminó siendo siguiente:

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

Redireccionar stderr a stdout generará un error y detendrá la ejecución del script si tiene $ ErrorActionPreference = 'Stop'. Pero el error no ocurrirá si no redirige stderr a stdout. ¡Extraño! –

+0

@ RafałKłys: raro, de hecho; es un _bug_: vea https://github.com/PowerShell/PowerShell/issues/4002 – mklement0

8

Si desea suprimir el uso única stderr:

svn info $url 2>$null 
Cuestiones relacionadas