Раньше я получал все устройства Intune с помощью Invoke-RestMethod и выполнял выбор объекта для возвращаемых данных. Теперь, когда мне нужно использовать Invoke-MgGraphRequest, возвращаемый массив не любит select-object. Значение свойства возвращается по имени «Array.property», а не по Select-Object.
есть ли способ использовать здесь объект выбора?
В примере ниже:
$Devices | select deviceName # Does not work #
$Devices.devicename # it works #
$uri = "https://graph.microsoft.com/beta/deviceManagement/managedDevices?`$Filter= (deviceType eq 'desktop') or (deviceType eq 'windowsRT') or (deviceType eq 'winEmbedded')" #30 min to run - 136 trys
$DevicesResponse = (Invoke-MgGraphRequest -Uri $uri -Method Get)
$Devices = $DevicesResponse.value
$DevicesNextLink = $DevicesResponse.'@odata.nextLink'
$i = 0
while ($DevicesNextLink -ne $null) {
Write-Host $i -BackgroundColor DarkGreen
$DevicesResponse = (Invoke-MgGraphRequest -Uri $DevicesNextLink -Method Get)
$DevicesNextLink = $DevicesResponse.'@odata.nextLink'
$Devices += $DevicesResponse.value
$i++
$Devices.count
$date = Get-Date
$date.DateTime
}


Invoke-MgGraphRequest выводит hashtable по умолчанию в PowerShell 5.1 Select-Object не может обрабатывать их из конвейера, поэтому решение простое: -OutputType psobject, чтобы вместо этого командлет выводил пользовательские объекты. Логику пейджинга также можно упростить:
$uri = "https://longurihere...."
$i = 0
$devices = do {
Write-Host $i -BackgroundColor DarkGreen
$response = Invoke-MgGraphRequest GET $uri -OutputType psobject
$uri = $response.'@odata.nextLink'
if ($response.value) {
$response.value
}
$i++
(Get-Date).DateTime | Write-Host
}
while ($uri)
$Devices | Select-Object deviceName # should work