Я считаю, что стандартное отображение ошибок Powershell (красный текст, многострочный дисплей) немного отвлекает. Можно ли это настроить?





Да и да.
Вы можете использовать встроенный объект $host, если все, что вам нужно, это изменить цвет текста. Однако вы не можете изменить само сообщение об ошибке - оно жестко запрограммировано.
Что вы можете сделать, так это (а) подавить сообщения об ошибках и вместо этого (б) перехватить ошибки и отобразить свои собственные.
Выполните (а), установив $ErrorActionPreference = "SilentlyContinue" - это не остановит ошибку, но подавит сообщения.
Выполнение (б) требует немного больше работы. По умолчанию большинство команд PowerShell не создают перехватываемых исключений. Поэтому вам придется научиться запускать команды и добавить параметр -EA «Stop», чтобы генерировать перехватываемое исключение, если что-то пойдет не так. Как только вы это сделаете, вы можете создать ловушку в оболочке, набрав:
trap {
# handle the error here
}
Вы можете поместить это в свой сценарий профиля, а не вводить его каждый раз. Внутри ловушки вы можете вывести любой текст ошибки, который вам нравится, с помощью командлета Write-Error.
Вероятно, больше работы, чем вы хотели, но в основном вы бы сделали то, о чем просили.
Вот несколько вещей, которые позволят вам настроить вывод консоли. Вы можете установить эти настройки в своем профиле по своему усмотрению или создать функции / скрипты для их изменения для различных целей. Может быть, вам иногда нужен режим «Не жучите меня», а для других - «Покажи мне, что все идет не так». Вы можете создать функцию / скрипт для переключения между ними.
## Change colors of regular text
$Host.UI.RawUI.BackGroundColor = "DarkMagenta"
$Host.UI.RawUI.ForeGroundColor = "DarkYellow"
## Change colors of special messages (defaults shown)
$Host.PrivateData.DebugBackgroundColor = "Black"
$Host.PrivateData.DebugForegroundColor = "Yellow"
$Host.PrivateData.ErrorBackgroundColor = "Black"
$Host.PrivateData.ErrorForegroundColor = "Red"
$Host.PrivateData.ProgressBackgroundColor = "DarkCyan"
$Host.PrivateData.ProgressForegroundColor = "Yellow"
$Host.PrivateData.VerboseBackgroundColor = "Black"
$Host.PrivateData.VerboseForegroundColor = "Yellow"
$Host.PrivateData.WarningBackgroundColor = "Black"
$Host.PrivateData.WarningForegroundColor = "Yellow"
## Set the format for displaying Exceptions (default shown)
## Set this to "CategoryView" to get less verbose, more structured output
## http://blogs.msdn.com/powershell/archive/2006/06/21/641010.aspx
$ErrorView = "NormalView"
## NOTE: This section is only for PowerShell 1.0, it is not used in PowerShell 2.0 and later
## More control over display of Exceptions (defaults shown), if you want more output
$ReportErrorShowExceptionClass = 0
$ReportErrorShowInnerException = 0
$ReportErrorShowSource = 1
$ReportErrorShowStackTrace = 0
## Set display of special messages (defaults shown)
## http://blogs.msdn.com/powershell/archive/2006/07/04/Use-of-Preference-Variables-to-control-behavior-of-streams.aspx
## http://blogs.msdn.com/powershell/archive/2006/12/15/confirmpreference.aspx
$ConfirmPreference = "High"
$DebugPreference = "SilentlyContinue"
$ErrorActionPreference = "Continue"
$ProgressPreference = "Continue"
$VerbosePreference = "SilentlyContinue"
$WarningPreference = "Continue"
$WhatIfPreference = 0
Вы также можете использовать параметры -ErrorAction и -ErrorVariable в командлетах, чтобы воздействовать только на этот вызов командлета. Второй будет отправлять ошибки в указанную переменную вместо значения по умолчанию $ Error.
Хороший момент, PS v2.0 теперь имеет другую систему. Я обновлю свой ответ.
Это фантастика.
К сожалению, MS сломала эти ссылки в блогах во время одной из своих многочисленных миграций платформы блогов, я в настоящее время не готов проверять новые версии, а URL-адреса машин обратного пути слишком длинные для использования в блоках кода. Однако я нашел эти URL-адреса для первой статьи: новый дом и обратная машина.
Кроме того, вы можете сделать это, чтобы написать конкретную строку текста ошибки:
$Host.UI.WriteErrorLine("This is an error")
(Реквизит Крису Сирсу за этот ответ)
Это может быть или не быть тем, что вы хотите, но есть предпочтительная переменная $ ErrorView, которую вы можете установить:
$ErrorView = "CategoryView"
Это дает более короткое однострочное сообщение об ошибке, например:
[PS]> get-item D:\blah
ObjectNotFound: (D:\blah:String) [Get-Item], ItemNotFoundException
Обратите внимание, что переменные $ ReportErrorShow * фактически не действуют в PowerShell 2.0. См. technet.microsoft.com/en-us/library/dd347675.aspx