PowerShellで標準エラーを変数にリダイレクトする


16

エラーが見つかった場合に警告するdcdiagテストのスクリプトを作成したいと思います。私はPowerShellでこれを行うことができると思いました...

$test = dcdiag 2>$err

現時点ではdcdiagからのエラーはないので、直接テストすることはできませんでしたが、別のPowerShellスクリプトを作成して例外をスローし、そのスクリプトを使用してこのメ​​ソッドをテストできると期待していました。上記の方法ではこれが機能しなかったため、私は以下を選択しました。

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

私のテストケースでは機能しましたが、これがdcdiagから標準エラーを検出するかどうかはわかりません。

dcdiagで使用したい場合、PowerShellの変数への標準エラーリダイレクトをどのように達成するのが最善ですか?

回答:


18

try...catch この場合は役に立ちません。

あなたがしたいことがあります:

$test = dcdiag 2>&1
$err = $test | ?{$_.gettype().Name -eq "ErrorRecord"}
if($err){
    # Error has occurred
}

3
ああ、元の質問では言いませんでした。stdoutとstderrの両方を保持することは可能ですか?すなわち、$ test = stdoutおよび$ err = stderr?
Ablue

2
@Ablue- $test両方を持つため、エラーをにフィルタリングしています$err
マノジュルド

1
$ ErrorActionPreferenceが「SilentlyContinue」に設定されていないことを確認してください。エラーの場合、ストリームは利用できません。
cmcginty

@cmcgintyは、実際には$ ErrorActionPreferenceを「Continue」に設定する必要があります。SilentlyContinueを使用すると、stderrが完全に削除されるため、stdoutのみがキャプチャされます(少なくともpowershell 5で)
Simon

2
@Simon正解、SilentlyContinueを使用しないでください。
cmcginty
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.