Ваш $categories[0]
объект содержит свойство body
со строковым значением @{custom_field_value_id=12345}
. Когда вы передаете @{custom_field_value_id=12345}
непосредственно в -Body
параметр Invoke-RestMethod , он обрабатывается как [HashTable]
. Чтобы ваш первый пример кода обрабатывал значение -Body
так же, как и второе, вам необходимо преобразовать строку в таблицу ha sh.
$body = $categories[0].body -replace '^@{|}$' | ConvertFrom-Stringdata
Invoke-RestMethod -Headers $headers -Method POST -Uri $categories[0].url -Body $body
-replace
использует сопоставление с регулярным выражением, а затем заменяет совпавшие символы на строку замены. Поскольку мы исключаем замещающую строку, замена по сути является удалением совпадающих символов.
^@{
соответствует началу строки (^
) и буквальным символам @{
. |
- это чередование (OR
). }
является буквальным }
символом. $
соответствует концу строки.
Цель состоит в том, чтобы удалить все лишние символы, оставляя после себя синтаксис key=value
. Этот синтаксис может быть передан в ConvertFrom-Stringdata , который преобразует данные в таблицу ha sh.
Я считаю, что лучшее решение - это исправить данные в источнике до него запрашивается так, чтобы body
уже содержал соответствующий тип данных.