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
).
Там два отдельных поля, которые могут содержать сообщение (строку), которое лучше всего характеризует имеющуюся ошибку:
Метод .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