ErrorVariable вывод - PullRequest
       0

ErrorVariable вывод

1 голос
/ 02 апреля 2020

Я в течение двух дней ищу решение или что-то, что помогает мне понять, почему.

Для некоторых действий я хочу отправить любую ошибку в «-ErrorVariable create_error». Нет проблем. После этого я просто хочу исключение из сообщения об ошибке:

$create_error = $create_error.Exception

Теперь вывод переменной:

$create_error
Access to the path '2021' is denied.

Но если я использую эту переменную в качестве основного текста для электронная почта, я получаю следующий текст электронной почты:

    System.UnauthorizedAccessException: Access to the path '2021' is denied. 
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost) 
    at System.IO.DirectoryInfo.CreateSubdirectoryHelper(String path, Object directorySecurity) 
    at System.IO.DirectoryInfo.CreateSubdirectory(String path) 
    at Microsoft.PowerShell.Commands.FileSystemProvider.CreateDirectory(String path, Boolean streamOutput)

Sendmail:

Send-MailMessage -To $to -From $from -Subject $subject -Body $create_error

Любые идеи, как я получаю в электронном письме только читаемое человеком сообщение об ошибке?

Спасибо! С наилучшими пожеланиями!

1 Ответ

4 голосов
/ 02 апреля 2020

tl; dr :

Для получения только ошибок сообщений , связанных с записями ошибок PowerShell, собранными с параметром common -ErrorVariable :

$create_error.ForEach('ToString') # Call .ToString() on all records

Примечание. Если ваша переменная содержит только одну запись ошибки (не входит в коллекцию), просто вызовите .ToString(), например, при обращении к одной ошибке в сеансовые автоматы c $Error коллекция:

Get-Item NoSuch -ErrorAction SilentlyContinue # provoke an error
# Access the most recent error individually:
$Error[0].ToString() # -> 'Cannot find path '...\NoSuch' because it does not exist.'

Справочная информация:

Общий параметр -ErrorVariable собирает (не прекращающиеся) ошибки, возникающие во время выполнение данной команды как System.Management.Automation.ErrorRecord объектов в массиве, подобном массиву (System.Collections.ArrayList) - даже если собрана только одна ошибка.

Эти записи ошибок обертывают. NET исключения, дополняя их дополнительными метаданными, относящимися к PowerShell, такими как местоположение ошибки в файле сценария (*.ps1).

Там два отдельных поля, которые могут содержать сообщение (строку), которое лучше всего характеризует имеющуюся ошибку:

  • .Exception.Message

  • опционально, .ErrorDetails.Message, который можно использовать для переопределения .Exception.Message в стандартном формате отображения ошибки в консоли.

Метод .ToString() оборачивает эту логику c, поэтому это самый простой способ получить сообщение об ошибке.


Пример кода :

Примечание. Обычно .ErrorDetails - это $null. Установка этого требует дополнительного шага при построении записи об ошибке.
Вот пример в PowerShell (хотя обратите внимание, что более распространено создание записей об ошибках в скомпилированных командлетах):

# Create an error record.
$err = [System.Management.Automation.ErrorRecord]::new(
  [InvalidOperationException]::new('foo'),  # the exception being wrapped
  'errId',             # error ID
  'InvalidOperation',  # category 
  $null                # the target object
)
# Then assign an ErrorDetails instance with a custom message.
$err.ErrorDetails = [System.Management.Automation.ErrorDetails] 'bar'

Теперь, $err.Exception.Message отчеты 'foo' и $err.ErrorDetails.Message 'bar'. Когда вы вызываете .ToString(), значение .ErrorDetails.Message имеет приоритет; если .ErrorDetails были $null, то сообщалось бы 'foo':

PS> $err.ToString()
bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...