Перенаправить стандартную ошибку в переменную в 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
}

3
Ах, я не сказал в первоначальном вопросе; Можно ли сохранить как стандартный вывод, так и стандартный вывод? то есть $ test = stdout и $ err = stderr?
Абле

2
@Ablue - $testбудет иметь оба, поэтому я отфильтровываю ошибку $err.
manojlds

1
Убедитесь, что для $ ErrorActionPreference не установлено значение «SilentlyContinue». Когда это поток ошибок не доступен.
cmcginty

@cmcginty на самом деле $ ErrorActionPreference следует установить на «Продолжить». Использование SilentlyContinue будет захватывать только стандартный вывод, так как стандартный вывод будет полностью удален (по крайней мере, на powershell 5)
Симон

2
@ Симон Правильно, я сказал, что НЕ используйте SilentlyContinue.
cmcginty
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.