Строка в массив или хеш-таблицу - PullRequest
0 голосов
/ 14 мая 2019

Мы пытаемся выполнить обработку ошибок в командлете Invoke-WebReqeust. Обычно используется что-то вроде этого:

Try {
    # Invoke-WebRequest ....
}
catch {
    $result = $_.Exception.Response.GetResponseStream()
    $reader = New-Object System.IO.StreamReader($result)
    $reader.BaseStream.Position = 0
    $reader.DiscardBufferedData()
    $responseBody = $reader.ReadToEnd();
    Write-Host $responseBody
}

При обнаружении ошибки будет возвращено следующее String:

{"Ошибка": "AdmConDataError: Нет (IBDataConflictError: IB.Data.Conflict: MAC-адрес 03: 03: 33: 33: 33: 36 используется в двух фиксированных адресах 10.20.32.1 и 10.20.32.1, которые являются в та же сеть 10.20.32.0/24.) ", "code": "Client.Ibap.Data.Conflict", "текст": "MAC-адрес 03: 03: 33: 33: 33: 36 используется в двух фиксированных адресах 10.20.32.1 и 10.20.32.1, которые находятся в одной сети 10.20.32.0/24." }

Сейчас мы пытаемся проанализировать String для Array или hashtable для простоты использования. Желаемый результат будет:

@{
    Error = 'AdmConDataError: None (IBDataConflictError: IB.Data.Conflict:MAC address 03:03:33:33:33:36 is used in two fixed addresses 10.20.32.1 and 10.20.32.1, which are in the same network 10.20.32.0/24.)'
    Code  = 'Client.Ibap.Data.Conflict'
    text  = 'MAC address 03:03:33:33:33:36 is used in two fixed addresses 10.20.32.1 and 10.20.32.1, which are in the same network 10.20.32.0 / 24.'
}

С помощью других постов мы думали о том, чтобы вернуться к regexes. Но мы не можем понять это правильно. С помощью -match '(?<=\")(.*?)(?=\")' мы пытались сопоставить все в двойных кавычках, но этого явно недостаточно Есть идеи по поводу лучшего подхода?

Ответы [ 2 ]

3 голосов
/ 14 мая 2019

Строка ошибки в примере является допустимой JSON.

Вы можете просто сделать $responseBody | ConvertFrom-Json, чтобы получить объект с (среди членов метода по умолчанию) тремя NoteProperties:

  • код
  • ошибка
  • текст
1 голос
/ 14 мая 2019

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

$resultString = '{ "Error": "AdmConDataError: None (IBDataConflictError: IB.Data.Conflict:MAC address 03:03:33:33:33:36 is used in two fixed addresses 10.20.32.1 and 10.20.32.1, which are in the same network 10.20.32.0/24.)", "code": "Client.Ibap.Data.Conflict", "text": "MAC address 03:03:33:33:33:36 is used in two fixed addresses 10.20.32.1 and 10.20.32.1, which are in the same network 10.20.32.0/24." }'

$result = $resultString | ConvertFrom-Json

Вы можете, конечно, объединить эти шаги, это немного яснее, чем это. В любом случае $result будет содержать «PsCustomObject» со свойствами «Ошибка», «Код» и «Текст», к которым вы затем сможете обращаться с обычным синтаксисом:

$result.Code
Client.Ibap.Data.Conflict
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...