Redirige el error estándar a una variable en PowerShell

16

Me gustaría realizar una prueba de dcdiag para alertarme si encuentra algún error. Pensé que podría hacer esto en PowerShell ...

$test = dcdiag 2>$err

No tengo ningún error de dcdiag en este momento, por lo que no pude probarlo directamente, pero escribí otro script de PowerShell para lanzar una excepción, esperando poder probar este método usando ese script. Esto no funcionó usando el método anterior, así que opté por:

try {
    $test = dcdiag
}
catch { 
    $err = $_.Exception.Message
}

Funcionó para mi caso de prueba, pero no sé si esto detectará un error estándar de dcdiag.

¿Cómo debería lograr la redirección de error estándar a una variable en PowerShell dado que me gustaría usarlo con dcdiag?

Un azul
fuente

Respuestas:

18

try...catch No ayudaría en este caso.

Es posible que desee hacer:

$test = dcdiag 2>&1
$err = $test | ?{$_.gettype().Name -eq "ErrorRecord"}
if($err){
    # Error has occurred
}
manojlds
fuente
3
Ah, no dije en la pregunta original; ¿Es posible mantener tanto stdout como stderr? es decir, $ test = stdout y $ err = stderr?
Ablue
2
@Ablue: $testtendrá ambos, es por eso que estoy filtrando el error $err.
manojlds
1
Asegúrese de que $ ErrorActionPreference no esté configurado en "SilentlyContinue". Cuando es el flujo de errores no está disponible.
cmcginty
@cmcginty en realidad $ ErrorActionPreference debe establecerse en "Continuar". El uso de SilentlyContinue solo capturará stdout ya que stderr se eliminará por completo (al menos en PowerShell 5)
Simon Bergot
2
@Simon Correcto, dije NO use SilentlyContinue.
cmcginty