如何根据 powershell 中的主机名将设备对象过滤为单个设备对象?

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

我试图通过使用一个对象的单个设备的主机名来获取设备的站点名称,该对象包含 Powershell 中 100 台设备的详细信息。我如何过滤它?

数据最初来自 API 并作为 Json 被拉入,我已经使用 ConvertFrom-Json 转换它所以它现在应该在一个对象中。

我已经尝试通过 Select-ObjectWhere-Object 管道传递对象,但没有成功,我使用命令的方式似乎没有做任何事情,但我不确定我在做什么做错了。

最初使用以下方法提取数据:

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

然后使用以下方法转换为对象:

$allDevicesObj = $allDevices | ConvertFrom-Json

然后可以使用以下方法查看结果:

Write-Host $allDevicesObj.devices

这将显示类似这样的数据:

@{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;} 

我希望能够根据主机名将输出过滤为结果之一,因此我尝试组合使用 Where-ObjectSelect-Object 函数:

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

这似乎什么也没做,又显示了所有内容。我试着不那么具体,但也只有 select 站点名称:

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

但这也再次显示了一切。我用 Select-Object 尝试了类似的变体,结果相同。

当使用 Where-Object 指定我想要的对象,然后使用 Select-Object 仅 select 站点名称 value/property 我希望输出为是

site1

Write-Host 将您的对象的字符串表示形式写入控制台,但不会向管道发送任何内容。使用 Where-Object 过滤并只允许将其写入输出流。

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

要只获取网站,您可以从 where-object 管道到 select-object

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