Powershell: Як я можу зупинити відображення помилок у сценарії?


92

Коли мій сценарій PowerShell намагається, наприклад, створити об'єкт SQL Server для сервера, який не існує (у моєму випадку "бла"), PowerShell відображає багато помилок PowerShell червоним кольором.

Оскільки мій скрипт перевіряє значення $?після таких викликів, а також відображає та реєструє помилки, я волів би не відображати кілька рядків помилок PowerShell.

Як я можу деактивувати ті, що відображаються для мого сценарію?

Відповіді:


132

У вас є кілька варіантів. Найпростіше передбачити використання ErrorActionналаштувань.

-Erroractionє універсальним параметром для всіх командлетів. Якщо є спеціальні команди, які ви хочете ігнорувати, ви можете використовувати їх, -erroraction 'silentlycontinue'які в основному ігноруватимуть усі повідомлення про помилки, створені цією командою. Ви також можете використовувати Ignoreзначення (у PowerShell 3+):

На відміну від SilentlyContinue, Ignore не додає повідомлення про помилку до автоматичної змінної $ Error.

Якщо ви хочете ігнорувати всі помилки в сценарії, ви можете використовувати системну змінну $ErrorActionPreferenceі зробити те саме:$ErrorActionPreference= 'silentlycontinue'

Дивіться about_CommonParameters для отримання додаткової інформації про -ErrorAction. Див about_Preference_Variables для отримання додаткової інформації про $ ErrorActionPreference.


вам потрібна одинарна лапка в -erroraction 'мовчки продовжувати'? Intellisese показує варіанти і не додає жодної цитати.
PAS,

1
Якщо наведений вище формат не працює для вас, перейдіть за посиланням, поданим вище. Мені довелося форматувати як -ErrorAction:SilentlyContinueу PS 5.1. Я зателефонував своєму командлету з пакета, тому не знаю, чи має це значення. Але хороша інформація, коли ви знаєте допустиму помилку, може бути викинута.
Девід

--rm. \ Windows.old \ -Force -Recurse -Verbose -ErrorAction SilentlyContinue -WarningAction SilentlyContinue </code>
Tertius Geldenhuys

18

Windows PowerShell забезпечує два механізми повідомлення про помилки: один механізм припинення помилок та інший механізм припинення помилок .

Внутрішній код CmdLets може викликати ThrowTerminatingErrorметод, коли виникає помилка, яка не дозволяє або не повинна дозволяти командлету продовжувати обробляти свої введені об'єкти. Сценарист може використовувати їх виняток для виявлення цих помилок.

ЕКС:

try
{
  Your database code
}
catch
{
  Error reporting/logging
}

Внутрішній код CmdLets може викликати WriteErrorметод для повідомлення про помилки, що не припиняються, коли командлет може продовжувати обробку вхідних об'єктів. Потім сценарист може використовувати опцію -ErrorAction, щоб приховати повідомлення, або скористатися параметром, $ErrorActionPreferenceщоб налаштувати всю поведінку сценарію.


8

У мене була подібна проблема при спробі вирішити імена хостів за допомогою [system.net.dns]. Якщо IP не був вирішений .Net видав завершальну помилку. Щоб запобігти помилці завершення і зберегти контроль над результатом, я створив функцію за допомогою TRAP.

ЕГ

Function Get-IP 
{PARAM   ([string]$HostName="")
PROCESS {TRAP 
             {"" ;continue} 
             [system.net.dns]::gethostaddresses($HostName)
        }
}

3

Ви тут далеко від шляху.

У вас вже є гарне, велике повідомлення про помилку. Чому на Землі ви хочете написати код, який $?явно перевіряє після кожної окремої команди ? Це надзвичайно громіздко та схильне до помилок. Правильним рішенням є припинення перевірки$? .

Замість цього використовуйте вбудований механізм PowerShell, щоб підірвати для вас. Ви вмикаєте його, встановлюючи вищий рівень помилок :

$ErrorActionPreference = 'Stop'

Я ставлю це вгорі кожного сценарію, який я коли-небудь писав, і тепер мені не потрібно перевіряти $?. Це робить мій код набагато простішим та надійнішим.

Якщо у вас трапляються ситуації, коли вам дійсно потрібно відключити цю поведінку, ви можете або catchпомилку, або передати налаштування певній функції, використовуючи загальне -ErrorAction. У вашому випадку ви, ймовірно, хочете, щоб ваш процес зупинився на першій помилці, виявив помилку, а потім увійшов до неї.

Зверніть увагу, що це не обробляє випадок, коли зовнішні виконувані файли виходять з ладу (код виходу ненульовий, звичайно), тому вам все одно потрібно перевірити, $LASTEXITCODEчи викликаєте ви якийсь. Незважаючи на це обмеження, настройка все одно економить багато коду та зусиль.

Додаткова надійність

Ви також можете розглянути можливість використання жорсткого режиму :

Set-StrictMode -Version Latest

Це заважає PowerShell мовчки продовжувати роботу, коли ви використовуєте неіснуючу змінну та в інших дивних ситуаціях. ( -VersionДетальніше про те, що він обмежує, див. У параметрі.)

Поєднання цих двох налаштувань робить PowerShell набагато більшою швидкістю відмов, що значно спрощує програмування на ній.



2

У деяких випадках ви можете створити конвеєр після команди Out-Null

command | Out-Null

-1

Якщо ви хочете, щоб повідомлення про помилки PowerShell було вимкнено для командлета, але все ж хочете виявити помилку, використовуйте "-erroraction 'silentlyStop'"


Такої дії немає. Незважаючи на те, що існує дія «Зупинити».
Марвін Дікгаус,

Але це дозволяє придушити червоне повідомлення про помилку і при цьому використовувати команду / розділ catch при використанні New-Item -ItemType directory(PowerShell v2.0)
Мілан Керслагер

@MilanKerslager не могли б ви люб'язно показати зразок коду - оскільки я, як і всі інші, вважаємо, що немає такого ActionPreference, як '
SilentlyStop

Я досить впевнений, що Міккель мав на увазі SilentlyContinue, а не мовчки Stop, тому що це набагато більше сенсу у змісті того, що ви хочете, щоб він робив.
Джон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.