Сбой данных Select-Object из успешного метода Invoke-RestMode - PullRequest
1 голос
/ 06 июля 2019

У меня есть рабочий звонок в службу отдыха, используя Invoke-RestMethod -Uri https://.... Результат вызова, в JSON, может быть перенесен в данные Format-Table -Property ..., и данные будут показаны.

Но когда Select-Object -Property ... используется после вызова с теми же параметрами, у PSObject есть столбцы, но нет данных для них. Если я использую другой веб-сервис, вызов будет работать.

enter image description here

Что может быть причиной того, что PSObject не показывает никаких значений?


Рабочий пример для общественных веб-сервисов отдыха

Invoke-RestMethod -Uri https://jsonplaceholder.typicode.com/todos/1 |
Select-Object -Property title

Результат

@{title=delectus aut autem}

Новый API Failure Different

Invoke-RestMethod -Uri https://cat-fact.herokuapp.com/facts | Select-Object -Property text

enter image description here

Ответы [ 2 ]

3 голосов
/ 07 июля 2019

Вы наткнулись на нечестивую комбинацию двух странностей PowerShell при преобразовании массивов JSON :

  • Invoke-RestMethod и ConvertFrom-Json отправляют преобразованные массивы JSON в целом через конвейер вместо элемента элементом , как обычно

  • Select-Object не выполняет перечисление члена , поэтому он ищет указанное свойство (например, text) непосредственно в массиве , где он не ' t существует.

Для демонстрации проблемы на простом примере:

# Because ConvertFrom-Json sends an *array* (of 2 custom objects) through
# the pipeline, Select-Object looks for property .text on the *array* -
# and can't find it.
# The same applies to Invoke-RestMethod
PS> ConvertFrom-Json '[{ "text": "a" }, { "text": "b" }]' | Select-Object text

text
----
       # NO VALUES 

A простой обходной путь заключает в себе вызов ConvertFrom-Json / Invoke-RestMethod в (...), который заставляет перечисление массива, заставляя Select-Object работать как положено .:

# (...) forces enumeration
PS> (ConvertFrom-Json '[{ "text": "a" }, { "text": "b" }]') | Select-Object text

text
----
a
b

Обратите внимание, что такая команда, как Select-Object -Property text (без -ExpandProperty), по-прежнему выводит пользовательских объектов, которые имеют .text свойство , а не .text свойство значения .

Если все, что вас интересует, это свойство значения , решение проще, потому что вы можете использовать перечисленное выше перечисление членов непосредственно в массиве:

# Using .<propName> on an array (collection) implicitly returns the
# property values from the *elements* of that collection (member enumeration).
PS> (ConvertFrom-Json '[{ "text": "a" }, { "text": "b" }]').text
a
b

Обратите внимание, что теперь у вывода нет заголовка text, потому что выводятся просто строковые значения , а не пользовательские объекты.

3 голосов
/ 06 июля 2019

Ваша проблема во втором примере состоит в том, что нет НИОКР с именем text.[ ухмылка ]

единственный реквизит - all, который содержит массив объектов, которые действительно содержат реквизит с именем text.так что вам нужно что-то, что может получить эту более глубокую опору.Одним из способов является использование двух Select-Object вызовов.как-то так ...

$Url = 'https://cat-fact.herokuapp.com/facts'
$RawIRM = Invoke-RestMethod -Uri $Url 
$SO_IRM = $RawIRM |
    Select-Object -ExpandProperty all |
    Select-Object -Property text

В $SO_IRM var теперь есть массив из 178 строк о кошках.[ ухмылка ]

...