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

问题描述 投票:1回答:1

我试图通过使用包含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;} 

我希望能够根据主机名将输出过滤为1个结果,所以我尝试使用Where-ObjectSelect-Object函数的组合:

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

这似乎什么都不做,再次展示一切。我尝试了一点不那么具体,但也只选择siteName:

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

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

当使用Where-Object指定我想要的对象然后只使用Select-Object选择siteName值/属性我希望得到的输出只是

site1
powershell stdout write-host
1个回答
3
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.