2011-05-04 15 views
48

Tengo algo de código:

$foo = someFunction 

Esto genera un mensaje de advertencia que quiero redirigir a $ nulo:

$foo = someFunction > $null 

El problema es que cuando hago esto, mientras subo el mensaje de advertencia, también tiene el efecto secundario negativo de NO poblar $ foo con el resultado de la función.

¿Cómo redirecciono la advertencia a $ null, pero sigo manteniendo $ foo poblado?

Además, ¿cómo redirige la salida estándar y el error estándar a nulo? (En Linux, es 2>&1.)

+1

Lo que produce el mensaje de advertencia? Si usted es el autor de 'someFunction', puede cambiarlo apropiadamente. – stej

+0

En realidad, en Bourne Shell (Linux), es '2>/dev/null 1>/dev/null'; El redireccionamiento que has mostrado redirige stderr al mismo lugar que stdout, que puede ser '/ dev/null', o puede ser un archivo normal. – jpaugh

Respuesta

10

Esto debería funcionar.

$foo = someFunction 2>$null 
-2

Suponiendo que el mensaje de error se devuelve en primer lugar:

$foo = someFunction 
$foo = $foo[1] 

Si el valor de la variable se devuelve en primer lugar:

$foo = someFunction 
$foo = $foo[0] 
97

prefiero esta forma de redirigir la salida estándar (PowerShell nativa) ...

($foo = someFunction) | out-null 

Pero esto también funciona:

($foo = someFunction) > $null 

Para redirigir el error estándar justo después de definir $ foo con resultado de "algunaFuncion", hacen

($foo = someFunction) 2> $null 

Este es efectivamente el mismo que se ha mencionado anteriormente.

O para redirigir los mensajes de error estándar de la "algunaFuncion" y luego definiendo $ foo con el resultado:

$foo = (someFunction 2> $null) 

Para redirigir tanto usted tiene algunas opciones:

2>&1>$null 
2>&1 | out-null 
+0

Gracias J. Eso resuelve uno de mis problemas también. –

2

mensajes de advertencia deben se escribirá con el cmdlet Write-Warning, que permite suprimir los mensajes de advertencia con el parámetro -WarningAction o la variable automática $WarningPreference. Una función necesita usar CmdletBinding para implementar esta característica.

function WarningTest { 
    [CmdletBinding()] 
    param($n) 

    Write-Warning "This is a warning message for: $n." 
    "Parameter n = $n" 
} 

$a = WarningTest 'test one' -WarningAction SilentlyContinue 

# To turn off warnings for multiple commads, 
# use the WarningPreference variable 
$WarningPreference = 'SilentlyContinue' 
$b = WarningTest 'test two' 
$c = WarningTest 'test three' 
# Turn messages back on. 
$WarningPreference = 'Continue' 
$c = WarningTest 'test four' 

Para que sea más corto en el símbolo del sistema, puede utilizar -wa 0:

PS> WarningTest 'parameter alias test' -wa 0 

Write-Error, Write-Verbose y escritura de depuración ofrecen una funcionalidad similar para sus correspondientes tipos de mensajes.

3

Si se trata de errores que desea ocultar puedes hacerlo de esta manera

$ErrorActionPreference = "SilentlyContinue"; #This will hide errors 
$someObject.SomeFunction(); 
$ErrorActionPreference = "Continue"; #Turning errors back on 
Cuestiones relacionadas