首页 > 解决方案 > 使用 powershell 的 Zscaler API Json 问题

问题描述

请参阅我目前使用的以下 powershell 代码。

$ZscalerURL = "https://ips.zscalertwo.net/cenr/json"
             $r = (Invoke-RestMethod -Uri $ZscalerURL).'zscalertwo.net'
             $results = New-Object PSObject

              $r.parameters.psobject.Properties.Name | 
             ForEach{ 
                 Add-Member -InputObject $results -NotePropertyName $_ -NotePropertyValue $r.parameters.$_.Value 
             }

我无法使用此方法和其他一些方法将 json 转换为可读格式,例如,我无法引用 $r.continent.city。

已经尝试使用 convertfrom-json 和 invoke-webrequest 并使用使用 foreach 循环的 hacky 方法,例如 $americas=foreach ($name in $r.'continent : Americas'){$name}

标签: jsonpowershell

解决方案


目前尚不清楚您的预期输出是什么。但是,您可以通过循环遍历所有大陆属性和城市属性来执行以下操作。然后将这些大陆和城市名称传递给网络地址对象。

$ZscalerURL = "https://ips.zscalertwo.net/cenr/json"
$r = (Invoke-RestMethod -Uri $ZscalerURL).'zscalertwo.net'

foreach ($continent in $r.psobject.properties.name) {
    foreach ($city in $r.$continent.psobject.properties.name) {
        $r.$continent.$city |
            Select-Object @{n='Continent';e={($continent -split ':')[-1].Trim()}},@{n='City';e={($city -split ':')[-1].Trim()}},*
    }
}

如果您想按原样列出大陆和城市属性而不进行任何操作,则可以省略该-split方法。rest 方法响应将大陆属性值提供为continent : <continent name>. 同样,城市属性值为city : <city name>。该-split方法摆脱了continent : city : 前缀。如果不进行任何操作,您将使用以下语法作为示例来检索特定城市的网络地址信息:

$r.'continent : emea'.'city : amsterdam'

推荐阅读