Leiten Sie den Standardfehler zu einer Variablen in PowerShell um

16

Ich möchte einen dcdiag-Test schreiben, um mich auf Fehler hinzuweisen. Ich dachte, ich könnte dies in PowerShell tun, indem ich ...

$test = dcdiag 2>$err

Ich habe im Moment keine Fehler von dcdiag, daher konnte ich das nicht direkt testen, aber ich habe ein anderes PowerShell-Skript geschrieben, um eine Ausnahme auszulösen, in der Hoffnung, dass ich diese Methode mit diesem Skript testen kann. Dies funktionierte nicht mit der oben beschriebenen Methode, also entschied ich mich für:

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

Es hat für meinen Testfall funktioniert, aber ich weiß nicht, ob dies einen Standardfehler von dcdiag hervorruft.

Wie erreiche ich die Standardfehlerumleitung zu einer Variablen in PowerShell am besten, wenn ich sie mit dcdiag verwenden möchte?

Ein blaues
quelle

Antworten:

18

try...catch würde in diesem Fall nicht helfen.

Vielleicht möchten Sie Folgendes tun:

$test = dcdiag 2>&1
$err = $test | ?{$_.gettype().Name -eq "ErrorRecord"}
if($err){
    # Error has occurred
}
manojlds
quelle
3
Ah, ich habe es in der ursprünglichen Frage nicht gesagt. ist es möglich, sowohl stdout als auch stderr zu halten? dh $ test = stdout und $ err = stderr?
Ablue
2
@Ablue - $testwird beides haben, deshalb filtere ich den Fehler aus $err.
Manojlds
1
Stellen Sie sicher, dass $ ErrorActionPreference nicht auf "SilentlyContinue" festgelegt ist. Wenn dies der Fall ist, ist der Fehlerstrom nicht verfügbar.
Cmcginty
@cmcginty eigentlich $ ErrorActionPreference sollte auf "Continue" gesetzt werden. Bei Verwendung von SilentlyContinue wird nur stdout erfasst, da stderr vollständig entfernt wird (zumindest auf Powershell 5)
Simon Bergot
2
@ Simon Richtig, ich sagte NICHT SilentlyContinue verwenden.
cmcginty