使用 PowerShell 获取 JSON - 如何获取多个数组下的所有键?
Fetching JSON with PowerShell - How do I fetch all keys under multiple arrays?
我正在尝试构建一个 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:\temp\test.json" -Raw | ConvertFrom-Json
我试图在我的 PowerShell 脚本中做的是获取所有配置了密钥 "isWebServer" : "true"
的服务器名称
如果我直接向下钻取每个数组,我可以成功实现我的目标。
($jsonFile.DEV.Product1 | Where-Object {$_.isWebServer -eq "true"}).serverName
但是,当我想从整个 DEV 环境中获取所有 Web 服务器时,我无法取得同样的成功。我正在寻找这样的东西,但实际上 return 东西。
($jsonFile.DEV | Where-Object {$_.isWebServer -eq "true"}).serverName
如何获取对象中所有数组下的所有内容?我习惯了 XPATH,在这种情况下我可以使用通配符,但我还没有在 JSON.
中找到等效项
这是一个可能的解决方案:
$json.DEV.PSObject.Properties.Value.Where{ $_.isWebServer -eq 'true' }.serverName
隐藏的 ( ) PSObject
成员允许我们访问属性 (Product1
, Product2
, .. .) DEV
对象,而无需事先知道它们的名称。
然后,使用存储在 PSObject.Properties
中的 member access enumeration, we get an array of all Value
members of the PSPropertyInfo
个对象。
为了过滤服务器对象,内部方法Where
用于return 只有符合给定条件的服务器。请随意使用 Where-Object
代替:
$json.DEV.PSObject.Properties.Value |
Where-Object isWebServer -eq 'true' |
ForEach-Object serverName
尽管我更喜欢内部方法,因为它们比管道更快(开销更少)并且编写起来更简洁。
看起来和我很久以前做的很像。看看 this 是否有帮助。
我正在尝试构建一个 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:\temp\test.json" -Raw | ConvertFrom-Json
我试图在我的 PowerShell 脚本中做的是获取所有配置了密钥 "isWebServer" : "true"
如果我直接向下钻取每个数组,我可以成功实现我的目标。
($jsonFile.DEV.Product1 | Where-Object {$_.isWebServer -eq "true"}).serverName
但是,当我想从整个 DEV 环境中获取所有 Web 服务器时,我无法取得同样的成功。我正在寻找这样的东西,但实际上 return 东西。
($jsonFile.DEV | Where-Object {$_.isWebServer -eq "true"}).serverName
如何获取对象中所有数组下的所有内容?我习惯了 XPATH,在这种情况下我可以使用通配符,但我还没有在 JSON.
中找到等效项这是一个可能的解决方案:
$json.DEV.PSObject.Properties.Value.Where{ $_.isWebServer -eq 'true' }.serverName
隐藏的 (PSObject
成员允许我们访问属性 (Product1
, Product2
, .. .) DEV
对象,而无需事先知道它们的名称。
然后,使用存储在 PSObject.Properties
中的 member access enumeration, we get an array of all Value
members of the PSPropertyInfo
个对象。
为了过滤服务器对象,内部方法Where
用于return 只有符合给定条件的服务器。请随意使用 Where-Object
代替:
$json.DEV.PSObject.Properties.Value |
Where-Object isWebServer -eq 'true' |
ForEach-Object serverName
尽管我更喜欢内部方法,因为它们比管道更快(开销更少)并且编写起来更简洁。
看起来和我很久以前做的很像。看看 this 是否有帮助。