获取JSON与PowerShell -我如何获取多个数组下的所有键?



我试图建立一个json文件,将在我们不同的脚本中使用,以获取我们的服务器详细信息。相同的脚本将在包含多个产品和组件的所有环境中使用。下面是我正在使用的json文件:

{
"DEV" : {
"Product1" : [
{"serverName" : "hostname1", "isWebServer" : "true"},
{"serverName" : "hostname2", "isWebServer" : "false"}
],
"Product2" : [
{"serverName" : "hostname3", "isWebServer" : "false"},
{"serverName" : "hostname4", "isWebServer" : "true"}
]
}
}

JSON文件被导入到一个变量中,我可以成功地使用它。

$jsonFile = Get-Content -Path "C:temptest.json" -Raw | ConvertFrom-Json

我在PowerShell脚本中要做的是获取所有配置了"isWebServer" : "true"键的serverName

如果我直接向下钻取每个数组,我可以成功地实现我的目标。

($jsonFile.DEV.Product1 | Where-Object {$_.isWebServer -eq "true"}).serverName

然而,当我想从整个DEV环境中获取所有web服务器时,我无法取得同样的成功。我正在寻找类似这样的东西,但它实际上会返回一些东西。

($jsonFile.DEV | Where-Object {$_.isWebServer -eq "true"}).serverName

如何获取对象中所有数组下的所有内容?我已经习惯了xpath,在这种情况下,我可以使用通配符,但我还没有在JSON中找到等效的。

这是一个可能的解决方案:

$json.DEV.PSObject.Properties.Value.Where{ $_.isWebServer -eq 'true' }.serverName

隐藏的(内在的)PSObject成员允许我们访问DEV对象的属性(Product1,Product2,…),而不必事先知道它们的名称。

然后,使用成员访问枚举,得到PSObject.PropertiesPSPropertyInfo对象的所有Value成员的数组。

要过滤服务器对象,使用内部方法Where只返回匹配给定条件的服务器。请随意使用Where-Object:

$json.DEV.PSObject.Properties.Value | 
Where-Object isWebServer -eq 'true' | 
ForEach-Object serverName

虽然我更喜欢内部方法,因为它们比管道更快(开销更少),而且写起来更简洁。

看起来和我很久以前做的很像。看看这是否有帮助。

相关内容

  • 没有找到相关文章

最新更新