Rediriger l'erreur standard vers une variable dans PowerShell

16

Je voudrais écrire un test dcdiag pour m'alerter s'il trouve des erreurs. Je pensais pouvoir le faire dans PowerShell en ...

$test = dcdiag 2>$err

Je n'ai pas d'erreurs de dcdiag pour le moment, donc je n'ai pas pu tester cela directement, mais j'ai écrit un autre script PowerShell pour lever une exception, en espérant pouvoir tester cette méthode en utilisant ce script. Cela n'a pas fonctionné en utilisant la méthode ci-dessus, j'ai donc opté pour:

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

Cela a fonctionné pour mon cas de test, mais je ne sais pas si cela ramassera l'erreur standard de dcdiag.

Comment dois-je obtenir au mieux la redirection d'erreur standard vers une variable dans PowerShell étant donné que je voudrais l'utiliser avec dcdiag?

Un bleu
la source

Réponses:

18

try...catch n'aiderait pas dans ce cas.

Vous voudrez peut-être faire:

$test = dcdiag 2>&1
$err = $test | ?{$_.gettype().Name -eq "ErrorRecord"}
if($err){
    # Error has occurred
}
manojlds
la source
3
Ah, je n'ai pas dit dans la question d'origine; est-il possible de garder à la fois stdout et stderr? c'est-à-dire $ test = stdout et $ err = stderr?
Ablue
2
@Ablue - $testaura les deux, c'est pourquoi je filtre l'erreur $err.
manojlds
1
Assurez-vous que $ ErrorActionPreference n'est pas défini sur "SilentlyContinue". Lorsqu'il l'est, le flux d'erreurs n'est pas disponible.
cmcginty
@cmcginty en fait $ ErrorActionPreference doit être défini sur "Continue". Utiliser SilentlyContinue ne capturera stdout que stderr sera complètement supprimé (au moins sur PowerShell 5)
Simon Bergot
2
@Simon Correct, j'ai dit NE PAS utiliser SilentlyContinue.
cmcginty