Как я могу получить описания исключений powershell в строку?

Я хочу получить доступ к тому же сообщению, которое печатает Powershell при отправке записи об ошибке в выходной поток

Пример:

Это сообщение об исключении At C:\Документы и Настройки \BillBillington\Desktop\psTest\exThrower.ps1:1 char: 6 + throw < < (New-Object ArgumentException ( "Это исключение" ));     + CategoryInfo: OperationStopped: (:) [], ArgumentException     + FullyQualifiedErrorId: Это исключение.

Я, когда получаю последний ErrorRecord, делая $Error [0], я не могу понять, как получить эту информацию простым способом.

Я нашел эту функцию "Resolve-Error" из расширений сообщества здесь, которая делает примерно то, что я хочу, но она печатает огромный полуформатированный список вещей, которые мне не нужны, что я должен тогда стричь

Есть ли способ получить доступ к сообщению, которое Powershell использует или терпит неудачу, что более простой способ получить хеш значений, которые меня волнуют, поэтому я могу поместить их в строку в выбранном мной формате?

Ответ 1

Если вы хотите получить более короткое сообщение (иногда более удобное для пользователя), чем @tomasr, это будет делать:

$error[0].ToString() + $error[0].InvocationInfo.PositionMessage

Вы получите что-то вроде:

Cannot find path 'C:\TEMP\_100804_135716\missing' because it does not exist.
At C:\TEMP\_100804_135716\test.ps1:5 char:15
+   Get-ChildItem <<<<  missing

Эта техническая информация будет исключена:

+ CategoryInfo          : ObjectNotFound: (C:\TEMP\_100804_135716\missing:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

Ответ 2

Как насчет:

$x = ($error[0] | out-string)

Это то, что вы хотели?

Ответ 3

Я взял это немного дальше, потому что мне не нравились многостроки из $error [0].InvocationInfo.PositionMessage.

Function FriendlyErrorString ($thisError) {
    [string] $Return = $thisError.Exception
    $Return += "`r`n"
    $Return += "At line:" + $thisError.InvocationInfo.ScriptLineNumber
    $Return += " char:" + $thisError.InvocationInfo.OffsetInLine
    $Return += " For: " + $thisError.InvocationInfo.Line
    Return $Return
}

[string] $ErrorString = FriendlyErrorString $Error[0]
$ErrorString

Вы можете посмотреть, что еще можно использовать для создания собственной строки с помощью:

$Error | Get-Member
$Error[0].InvocationInfo | Get-Member

Ответ 4

Foreach ($Errors in $Error){
  #Log Eintrag wird zusammengesetzt und in errorlog.txt geschrieben
  "[$Date] $($Errors.CategoryInfo.Category) $($Errors.CategoryInfo.Activity) $($Errors.CategoryInfo.Reason) $($Errors.CategoryInfo.TargetName) $($Errors.CategoryInfo.TargetType) $($Errors.Exception.Message)" |Add-Content $Path\errorlog.txt -Encoding UTF8
}

Вы также можете сделать это, и вы получите всю информацию об ошибке