Przekieruj błąd standardowy do zmiennej w PowerShell

16

Chciałbym napisać skrypt testu dcdiag, aby ostrzec mnie, jeśli wykryje jakieś błędy. Pomyślałem, że mogę to zrobić w PowerShell przez ...

$test = dcdiag 2>$err

W tej chwili nie mam żadnych błędów z dcdiag, więc nie mogłem przetestować tego bezpośrednio, ale napisałem inny skrypt PowerShell, aby zgłosić wyjątek, mając nadzieję, że mogę przetestować tę metodę za pomocą tego skryptu. Nie działało to przy użyciu powyższej metody, więc wybrałem:

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

Działa to w moim przypadku testowym, ale nie wiem, czy to wykryje standardowy błąd z dcdiag.

Jak najlepiej osiągnąć standardowe przekierowanie błędu do zmiennej w PowerShell, biorąc pod uwagę, że chciałbym używać jej z programem dcdiag?

Niebieski
źródło

Odpowiedzi:

18

try...catch nie pomogłoby w tym przypadku.

Możesz zrobić:

$test = dcdiag 2>&1
$err = $test | ?{$_.gettype().Name -eq "ErrorRecord"}
if($err){
    # Error has occurred
}
manojlds
źródło
3
Ach, nie powiedziałem w pierwotnym pytaniu; czy można zachować zarówno stdout, jak i stderr? tj. $ test = stdout i $ err = stderr?
Ablue
2
@Ablue - $testbędzie miał oba, dlatego odfiltrowuję błąd do $err.
manojlds
1
Upewnij się, że $ ErrorActionPreference nie jest ustawione na „SilentlyContinue”. Kiedy to jest, strumień błędów jest niedostępny.
cmcginty
@cmcginty faktycznie $ ErrorActionPreference należy ustawić na „Kontynuuj”. Użycie SilentlyContinue uchwyci tylko stdout, ponieważ stderr zostanie całkowicie usunięty (przynajmniej w PowerShell 5)
Simon Bergot
2
@ Simon Prawidłowo, powiedziałem NIE używaj SilentlyContinue.
cmcginty