Arahkan kesalahan standar ke variabel di PowerShell

16

Saya ingin menulis tes dcdiag untuk mengingatkan saya jika ada kesalahan. Saya pikir saya dapat melakukan ini di PowerShell oleh ...

$test = dcdiag 2>$err

Saya tidak memiliki kesalahan dari dcdiag saat ini, jadi saya tidak bisa mengujinya secara langsung, tetapi saya menulis skrip PowerShell lain untuk melempar pengecualian, berharap saya bisa menguji metode ini menggunakan skrip itu. Ini tidak berfungsi menggunakan metode di atas jadi saya memilih untuk:

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

Ini berhasil untuk test case saya, tetapi saya tidak tahu apakah ini akan mengambil kesalahan standar dari dcdiag.

Bagaimana cara terbaik saya mencapai redirect kesalahan standar ke variabel di PowerShell mengingat saya ingin menggunakannya dengan dcdiag?

Ablue
sumber

Jawaban:

18

try...catch tidak akan membantu dalam hal ini.

Anda mungkin ingin melakukan:

$test = dcdiag 2>&1
$err = $test | ?{$_.gettype().Name -eq "ErrorRecord"}
if($err){
    # Error has occurred
}
manojlds
sumber
3
Ah, saya tidak mengatakan dalam pertanyaan awal; apakah mungkin untuk tetap menggunakan stdout dan stderr? yaitu $ test = stdout dan $ err = stderr?
Ablue
2
@Blue - $testakan memiliki keduanya, itu sebabnya saya memfilter kesalahan $err.
manojlds
1
Pastikan $ ErrorActionPreference tidak disetel ke "SilentlyContinue". Ketika itu aliran kesalahan tidak tersedia.
cmcginty
@cmcginty sebenarnya $ ErrorActionPreference harus disetel ke "Lanjutkan". Menggunakan SilentlyContinue hanya akan menangkap stdout karena stderr akan sepenuhnya dihapus (setidaknya pada powershell 5)
Simon Bergot
2
@Simon Benar, saya bilang JANGAN gunakan SilentlyContinue.
cmcginty