【问题标题】:Getting Dynamic Key value from json using Powershell使用 Powershell 从 json 获取动态键值
【发布时间】:2021-08-09 10:45:47
【问题描述】:

这里的最终目标是获取基于最新版本 Nessus Agent 的 x64.msi 下载链接。我需要一种方法来获取具有“Nessus Agent”字符串匹配的第一个键,然后迭代下面的所有对象,直到找到 file 参数中的值的匹配项。

请注意,““Nessus Agents - 8.2.4”是动态的,因为版本号会随时间变化,因此此 key 值不能硬编码。

我是 Powershell 的新手,找不到任何有关如何执行此操作的示例,任何帮助都会很棒! :)

以下 JSON 对象示例:

{
   "releases":{
      "latest":{
         "Plugins Archive":[
            {
               "file":"Agent_plugins_expires_2021-05-23.tgz",
               "version":"null",
               "size":585141662,
               "release_date":"05/19/2021",
               "product_release_date":"05/19/2021",
               "md5":"d001d04decd3ddc0689590c24cd70b4f",
               "sha256":"a642b52c428b9ffd7214a76de65a895b2b1b863a9156223e7a80561c1538e766",
               "file_url":"https://www.tenable.com/downloads/api/v2/pages/nessus-agents/files/Agent_plugins_expires_latest.tgz"
            }
         ],
         "Nessus Agents - 8.2.4":[
            {
               "file":"NessusAgent-8.2.4-amzn.x86_64.rpm",
               "version":"8.2.4",
               "size":17067122,
               "release_date":"03/31/2021",
               "product_release_date":"04/08/2021",
               "md5":"00f3d1be5355f256621f9b1241cf0c05",
               "sha256":"5c6c3478e35296331e971278eabeaf693c3691f1ebf734adcae3cfbf6c6c23fa",
               "file_url":"https://www.tenable.com/downloads/api/v2/pages/nessus-agents/files/NessusAgent-latest-amzn.x86_64.rpm"
            },
            {
               "file":"NessusAgent-8.2.4-debian6_amd64.deb",
               "version":"8.2.4",
               "size":16824112,
               "release_date":"03/31/2021",
               "product_release_date":"04/08/2021",
               "md5":"c888f6e4ab60b4a2bd85f0b291d44171",
               "sha256":"c3655308cb3adbd1319a6eb77210c4eb2c031f5d2288d9affbc103ea0939f220",
               "file_url":"https://www.tenable.com/downloads/api/v2/pages/nessus-agents/files/NessusAgent-latest-debian6_amd64.deb"
            },
            {
               "file":"NessusAgent-8.2.4-es5.x86_64.rpm",
               "version":"8.2.4",
               "size":19471101,
               "release_date":"03/31/2021",
               "product_release_date":"04/08/2021",
               "md5":"c72ca4c47b44067204e394c6d131bb7b",
               "sha256":"06f70cf0fbd5d0622367042550d24c48545f61ea7f0856532ae2efa70475a06f",
               "file_url":"https://www.tenable.com/downloads/api/v2/pages/nessus-agents/files/NessusAgent-latest-es5.x86_64.rpm"
            },
            {
               "file":"NessusAgent-8.2.4-es6.x86_64.rpm",
               "version":"8.2.4",
               "size":19407452,
               "release_date":"03/31/2021",
               "product_release_date":"04/08/2021",
               "md5":"3b87ee638758201570adf66cbc369b67",
               "sha256":"56e7c130c38d915332093a287cdab39d402777b69f39afd7e1f476423b477af1",
               "file_url":"https://www.tenable.com/downloads/api/v2/pages/nessus-agents/files/NessusAgent-latest-es6.x86_64.rpm"
            },
            {
               "file":"nessus-agent-updates-8.2.4.tar.gz",
               "version":"8.2.4",
               "size":590396412,
               "release_date":"03/31/2021",
               "product_release_date":"04/08/2021",
               "md5":"4348bcf458acfb826c447ff8b5176057",
               "sha256":"0130b16ad01d9e189faaf8f51a9ebf824da69977d39b58e50460a24d2dc480a6",
               "file_url":"https://www.tenable.com/downloads/api/v2/pages/nessus-agents/files/nessus-agent-updates-latest.tar.gz"
            }

我的代码以:

开头
$output = "C:\nessus_releases.json";
$jout = Get-Content -Path $output -raw | ConvertFrom-Json;

作为测试,如果我运行以下命令,它会返回“Nessus-Agents - 8.2.4”键下的第二个对象:

Write-Output($jout.releases.latest.'Nessus Agents - 8.2.4'.Item(1));

但是,尝试以下方法来获取 key 值,不会返回任何内容:

$jout.releases.latest | ForEach-Object {
    Write-Output($_.key);
};

又试了下,没有返回任何东西:

$version = $jout.releases.latest | Where-Object {$_ -match "Nessus Agents"}
Write-Output($version)

更新:

我认为我有一种方法似乎可以获取密钥名称:

$properties = $jout.releases.latest |
Get-Member -MemberType Properties |
Select-Object -ExpandProperty Name

$version = $properties | Where-Object {$_ -match "Nessus Agents"}

Write-Output($version)

这会返回:

Nessus Agents - 8.2.4

【问题讨论】:

  • 你已经研究和尝试了什么?
  • @Ash 我尝试过以下$jout.releases.latest | ForEach-Object { Write-Output($_.key); } 也尝试过:$keys = $jout.releases.keys foreach ($key in $keys) { Write-Output($json[$key]) } 但它们什么也没返回。作为测试,只需执行以下操作:Write-Output($jout.releases.latest.'Nessus Agents - 8.2.4'.Item(1)) 确实返回第二个代理对象。所以数据是可读的。我只是不知道如何获取以“Nessus Agents*”开头的第一个键名
  • 对不起,我应该声明上述是在加载 json 文件后尝试的:$jout = Get-Content -Path $output | ConvertFrom-Json
  • 请编辑您的问题并将您尝试过的内容放入其中。在问题中更容易阅读。这可以帮助人们添加您迄今为止所做的工作,或建议一种新方法。它还使可能与您遇到相同问题的人更容易理解。
  • 对不起@Ash。我已经用我尝试过的代码更新了问题。

标签: json powershell


【解决方案1】:

如果我很清楚你想要什么:

$output = "C:\nessus_releases.json"
$jout = Get-Content -Path $output | ConvertFrom-Json

$keys = $jout.releases.latest.PSobject.Properties

foreach($key in $keys)
{
    if($key.Name.StartsWith("Nessus Agents")){
        $objs = $jout.releases.latest.($key.Name)
        "agent " + $key.Name + " : " + $objs.Count + " values"
        foreach($f in $objs){         
            $f.file + " -> url " + $f.file_url
        }
        return
    }
}

结果:

agent Nessus Agents - 8.2.4 : 5 values
NessusAgent-8.2.4-amzn.x86_64.rpm -> url https://www.tenable.com/downloads/api/v2/pages/nessus-agents/files/NessusAgent-latest-amzn.x86_64.rpm
NessusAgent-8.2.4-debian6_amd64.deb -> url https://www.tenable.com/downloads/api/v2/pages/nessus-agents/files/NessusAgent-latest-debian6_amd64.deb
NessusAgent-8.2.4-es5.x86_64.rpm -> url https://www.tenable.com/downloads/api/v2/pages/nessus-agents/files/NessusAgent-latest-es5.x86_64.rpm
NessusAgent-8.2.4-es6.x86_64.rpm -> url https://www.tenable.com/downloads/api/v2/pages/nessus-agents/files/NessusAgent-latest-es6.x86_64.rpm
nessus-agent-updates-8.2.4.tar.gz -> url https://www.tenable.com/downloads/api/v2/pages/nessus-agents/files/nessus-agent-updates-latest.tar.gz

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2016-06-22
    • 2021-03-04
    • 1970-01-01
    • 2016-09-21
    • 2020-09-02
    相关资源
    最近更新 更多