powershellstdoutwrite-host

How to filter an object of devices to a single one based on hostname in powershell?


I'm trying to get the sitename of a device by using the hostname of a single device from an object that contains the details of 100's of devices in Powershell. How do I filter it?

The data is originally from an API and is being pulled in as Json, I've converted it using ConvertFrom-Json so it should be in an object now.

I have tried piping the object through Select-Object and Where-Object unsuccessfully, the way I'm using the commands don't seem to do anything but I'm not sure what I'm doing wrong.

The data is initially pulled using:

$allDevices = New-AemApiRequest @params -ApiAccessToken $apiAccessToken

And is then converted to an object using:

$allDevicesObj = $allDevices | ConvertFrom-Json

The results of that can then be seen using:

Write-Host $allDevicesObj.devices

Which will show data similar to this:

@{id=1234; uid=123-456-789; siteId=1; siteUid=11aa; siteName=site1; deviceType=; hostname=DESKTOP-abc123;}
@{id=2345; uid=987-654-321; siteId=2; siteUid=22bb; siteName=site2; deviceType=; hostname=DESKTOP-abc456;} 
@{id=3456; uid=234-345-456; siteId=3; siteUid=33bb; siteName=site3; deviceType=; hostname=DESKTOP-abc789;} 

I want to be able to filter the output to 1 of the results based on the hostname, so I tried using a combination of the Where-Object and Select-Object functions:

Write-Host $allDevicesObj.devices | Where-Object {$_.hostname -eq DESKTOP-abc123}

That just seems to do nothing and displays everything again. I tried being a bit less specific, but to also only select the siteName:

Write-Host $allDevicesObj.devices | Where-Object -Contains "123" | Select-Object -Property siteName

But that just showed everything again too. I tried similar variants with Select-Object with the same results.

When using the Where-Object to specify the object I want and then to just select the siteName value/property using Select-Object I am hoping to get the output to just be

site1

Solution

  • Write-Host writes a string representation of your object to the console and doesn't send anything down the pipeline. Filter using Where-Object and just allow it to be written to the Output stream.

    $allDevicesObj | Where-Object {$_.hostname -eq 'DESKTOP-abc123'}
    

    To get just the site you can pipe from where-object to select-object

    $allDevicesObj | Where-Object {$_.hostname -eq 'DESKTOP-abc123'} | Select-Object -property SiteName