Вы наткнулись на нечестивую комбинацию двух странностей 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
, потому что выводятся просто строковые значения , а не пользовательские объекты.