【问题标题】:Add Values into Nested Objects in PowerShell like you can in Python在 PowerShell 中将值添加到嵌套对象中,就像在 Python 中一样
【发布时间】:2020-12-15 19:39:34
【问题描述】:

我正在寻找使用 PowerShell 输出一些类似于 Python 脚本的 JSON:

 {
"run_date": "2020-08-27",
"total_queries": 4,
"number_results": 3,
"number_warnings": 1,
"number_errors": 5,
"build_url": "https://some-url.com",
"queries":{
    "query_a":{
        "database_a": "102 rows",
        "database_b": "Error: See pipeline logs for details"
    },
    "query_b": "No results",
    "query_c": {
        "database_a": "Warning: Number of results exceeded maximum threshold - 6509 rows",
        "database_c": "Error: See pipeline logs for details",
        "database_d": "Error: See pipeline logs for details"
    }
} }

(忽略上面的右括号,由于某种原因,它不会在此处正确格式化)。

我正在使用 PowerShell 中的 foreach 循环来按顺序运行每个查询,具体取决于它们需要在哪些数据库上运行。

我知道在 Python 中我可以像这样创建 JSON 模板:

options = {
'run_date': os.environ['SYSTEM_PIPELINESTARTTIME'].split()[0],
'total_queries': 0,
'number_results': 0,
'number_warnings': 0,
'number_errors': 0,
'build_url': 'options = {
'run_date': os.environ['SYSTEM_PIPELINESTARTTIME'].split()[0],
'total_hunts': 0,
'number_results': 0,
'number_warnings': 0,
'number_errors': 0,
'build_url': 'https://some-url.com',
'queries': {} }

然后使用类似的东西:

options['queries'][filename][database] = '{} rows'.format(len(data))

将数据添加到 Python 字典中。

我尝试过使用嵌套的 PSCustomObjects,但是当在同一个数据库上运行不同的查询时我最终会发生冲突,因此它尝试使用相同的 Key 向 PSCustomObject 添加一个值。我想知道在 PowerShell 中是否有一种很好的“本机”方式来执行此操作,就像在 Python 中一样。

【问题讨论】:

  • 我猜你尝试过来自 powershell 对象的ConvertTo-Json? PS C:\> $json.queries.query_c.database_a = "600 rows" 然后PS C:\> PS C:\> $json | ConvertTo-Json
  • 你能显示由于键冲突而失败的代码吗?

标签: python json powershell hashtable pscustomobject


【解决方案1】:

原来我只是有点傻,不记得如何使用 PowerShell 对象。

首先将所有查询名称添加到父对象中,如下所示:

foreach($name in $getqueries){
$notiObj.queries | Add-Member -NotePropertyName $name.BaseName -NotePropertyValue ([PSCustomObject]@{})}

然后在循环中添加有关查询本身的信息:

$notificationObj.queries.$queryName | Add-Member -NotePropertyName $database -NotePropertyValue "$($dataTable.Rows.Count) Rows" 

【讨论】:

    【解决方案2】:

    如果所需的最终结果是一个Json 文件,实际上不需要处理复杂(而且相当繁琐)的[PSCustomObject] 类型。相反,您可能只使用[HashTable](或仅通过为哈希表添加前缀的有序字典,例如:[Ordered]@{...})

    要从 Json 文件转换 哈希表,请使用 ConvertFrom-Json -AsHashTable 参数(在 PowerShell 6.0 中引入)。 要构建模板(或只是了解 PowerShell 格式),您可能需要使用此 ConvertTo-Expression cmdlet:

    $Json | ConvertFrom-Json -AsHashTable | ConvertTo-Expression
    

    @{
            'number_errors' = 5
            'number_warnings' = 1
            'queries' = @{
                    'query_b' = 'No results'
                    'query_a' = @{
                            'database_a' = '102 rows'
                            'database_b' = 'Error: See pipeline logs for details'
                    }
                    'query_c' = @{
                            'database_a' = 'Warning: Number of results exceeded maximum threshold - 6509 rows'
                            'database_d' = 'Error: See pipeline logs for details'
                            'database_c' = 'Error: See pipeline logs for details'
                    }
            }
            'build_url' = 'https://some-url.com'
            'run_date' = '2020-08-27'
            'number_results' = 3
            'total_queries' = 4
    }
    

    意味着您可以将此模板分配给$Options,如下所示:

    $Options = @{
            'number_errors' = 5
            'number_warnings' = 1
            'queries' = @{ ...
    

    并轻松更改嵌套对象中的属性,例如:

    $Options.Queries.query_c.database_d = 'Changed'
    

    或向嵌套对象添加新属性:

    $Options.Queries.query_a.database_c = 'Added'
    

    结果:

    $Options | ConvertTo-Json
    

    {
      "run_date": "2020-08-27",
      "queries": {
        "query_a": {
          "database_c": "Added",
          "database_b": "Error: See pipeline logs for details",
          "database_a": "102 rows"
        },
        "query_b": "No results",
        "query_c": {
          "database_c": "Error: See pipeline logs for details",
          "database_d": "Changed",
          "database_a": "Warning: Number of results exceeded maximum threshold - 6509 rows"
        }
      },
      "number_results": 3,
      "build_url": "https://some-url.com",
      "total_queries": 4,
      "number_errors": 5,
      "number_warnings": 1
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多