Перенаправить стандартную ошибку в переменную в PowerShell

16

Я хотел бы написать сценарий теста dcdiag, чтобы предупредить меня, если он обнаружит какие-либо ошибки. Я думал, что смогу сделать это в PowerShell с помощью ...

$test = dcdiag 2>$err

В данный момент у меня нет ошибок от dcdiag, поэтому я не мог проверить это напрямую, но я написал другой сценарий PowerShell для исключения, надеясь, что смогу протестировать этот метод с помощью этого сценария. Это не сработало, используя метод выше, поэтому я выбрал:

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

Это сработало для моего тестового примера, но я не знаю, получит ли это стандартную ошибку из dcdiag.

Как лучше всего добиться стандартного перенаправления ошибок в переменную PowerShell, если я хочу использовать его с dcdiag?

Синий
источник

Ответы:

18

try...catch не поможет в этом случае.

Вы можете захотеть сделать:

$test = dcdiag 2>&1
$err = $test | ?{$_.gettype().Name -eq "ErrorRecord"}
if($err){
    # Error has occurred
}
manojlds
источник
3
Ах, я не сказал в первоначальном вопросе; Можно ли сохранить как стандартный вывод, так и стандартный вывод? то есть $ test = stdout и $ err = stderr?
Абле
2
@Ablue - $testбудет иметь оба, поэтому я отфильтровываю ошибку $err.
manojlds
1
Убедитесь, что для $ ErrorActionPreference не установлено значение «SilentlyContinue». Когда это поток ошибок не доступен.
cmcginty
@cmcginty на самом деле $ ErrorActionPreference следует установить на «Продолжить». Использование SilentlyContinue будет захватывать только стандартный вывод, так как стандартный вывод будет полностью удален (по крайней мере, на powershell 5)
Симон
2
@ Симон Правильно, я сказал, что НЕ используйте SilentlyContinue.
cmcginty