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?

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
}

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.