Вообще говоря:
Если команда выводит коллекций в виде отдельных объектов , Select-Object X, Y
не будет работать должным образом , потому чтоон будет искать эти свойства в объекте collection , где они не могут быть найдены, и в этом случае Select-Object
создает единственный объект с запрошенными свойствами, все из которыхзатем содержать $null
.
Invoke-RestMethod
- вероятный кандидат для такого поведения, поскольку он может неявно анализировать возвращаемое значение как JSON через ConvertFrom-Json
, что действительно выходные данные массивы как отдельные объекты ;это удивительное поведение обсуждается в этой проблеме GitHub .
Размещение (...)
вокруг команды принудительное перечисление , так что это может решить проблему:
# Place (...) around the Invoke-RestMethod call to force enumeration.
(Invoke-RestMethod -Uri "..." -Method Get) | select XXX,YY
Другой вариант - присвоить (промежуточную) переменную , как показано в вашем вопросе - хотя подход (...)
проще, если вам на самом деле не нужно хранить промежуточный результат.
# Store array in a variable.
$array = Invoke-RestMethod -Uri "..." -Method Get
# An array stored in a variable sent through the pipeline is
# invariably enumerated.
$array | select X,Y
Это работает, потому что отправка массива сохраняетсяв переменной через конвейер всегда перечисляет ее (отправляет ей элементы один за другим).
Путем присвоения переменной вы фактически стираетеразличие между командой, которая выводит N объектов один за другим и командой, которая выводит массив N-элементов как отдельный объект :
# Send an array *as a whole* through the pipeline.
PS> (Write-Output -NoEnumerate (1..3) | Measure-Object).Count
1 # That is, the 3-element array was sent as *one* object
# Wrapping the command in (...) forces enumeration.
PS> ((Write-Output -NoEnumerate (1..3)) | Measure-Object).Count
3 # elements were sent *one by one*
# Store output-as-a-whole array in a variable,
# then send the variable through the pipeline -
# which also forces enumeration.
PS> $array = Write-Output -NoEnumerate (1..3); ($array | Measure-Object).Count
3 # elements were sent *one by one*
И наоборот, , если вы do хотите отправить массив, хранящийся в переменной в целом через конвейер , у вас есть два варианта:
$array = 1..3
# Use Write-Output -NoEnumerate:
PS> (Write-Output -NoEnumerate $array | Measure-Object).Count
1 # array was sent *as a whole*
# Alternatively - faster and more concise, but more obscure -
# wrap the array in an aux. wrapper array, so that only
# the wrapper array is enumerated, sending the original array
# as a whole:
PS> (, $array | Measure-Object).Count
1 # array was sent *as a whole*