【问题标题】:How to filter an object of devices to a single one based on hostname in powershell? [duplicate]如何根据powershell中的主机名将设备对象过滤为单个设备? [复制]
【发布时间】:2019-04-25 10:41:39
【问题描述】:

我正在尝试通过使用单个设备的主机名从包含 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}

这似乎什么都不做,并再次显示所有内容。我试着不那么具体,但也只选择站点名称:

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

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

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

site1

【问题讨论】:

    标签: powershell stdout write-host


    【解决方案1】:

    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
    

    【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2020-08-20
    • 2013-04-08
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多