将标准错误重定向到PowerShell中的变量


16

我想编写一个dcdiag测试脚本,以在发现任何错误时提醒我。我以为我可以通过以下方式在PowerShell中执行此操作...

$test = dcdiag 2>$err

目前,我没有dcdiag的任何错误,因此无法直接进行测试,但是我编写了另一个PowerShell脚本以引发异常,希望可以使用该脚本测试此方法。使用上述方法无法使用,因此我选择了:

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

它适用于我的测试用例,但是我不知道这是否会从dcdiag中获取标准错误。

如果要与dcdiag一起使用,如何最好地实现将标准错误重定向到PowerShell中的变量?

Answers:


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 2011年

2
@Ablue- $test将同时具有两者,这就是为什么我将错误过滤到的原因$err
manojlds 2011年

1
确保未将$ ErrorActionPreference设置为“ SilentlyContinue”。在这种情况下,错误流将不可用。
cmcginty 2015年

@cmcginty实际上$ ErrorActionPreference应该设置为“ Continue”。使用SilentlyContinue将仅捕获stdout,因为stderr将被完全删除(至少在powershell 5上)
Simon Bergot

2
@Simon正确,我说过不要使用SilentlyContinue。
cmcginty
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.