我试图建立一个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.Properties
中PSPropertyInfo
对象的所有Value
成员的数组。
要过滤服务器对象,使用内部方法Where
只返回匹配给定条件的服务器。请随意使用Where-Object
:
$json.DEV.PSObject.Properties.Value |
Where-Object isWebServer -eq 'true' |
ForEach-Object serverName
虽然我更喜欢内部方法,因为它们比管道更快(开销更少),而且写起来更简洁。
看起来和我很久以前做的很像。看看这是否有帮助。