使用 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 是否有帮助。