Перенаправити стандартну помилку на змінну в 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
Ах, я не сказав у первісному питанні; чи можна зберігати як stdout, так і stderr? тобто $ test = stdout і $ err = stderr?
Аблуд

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

1
Переконайтесь, що для $ ErrorActionPreference не встановлено значення "SilentlyContinue". Коли це потік помилок, недоступний.
cmcginty

@cmcginty насправді $ ErrorActionPreference слід встановити на "Продовжити". Використання SilentlyContinue зафіксує лише stdout, оскільки stderr буде повністю видалений (принаймні, на powerhell 5)
Саймон Бергот

2
@Simon Правильно, я сказав, що НЕ використовуйте SilentlyContinue.
cmcginty
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.