簡體   English   中英

在 PowerShell 中將值添加到嵌套對象中,就像在 Python 中一樣

[英]Add Values into Nested Objects in PowerShell like you can in Python

我正在尋找使用 PowerShell 輸出一些類似於這樣的 JSON 以與 Python 腳本一起使用:

 { "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': {} }

然后使用類似的東西:

選項['查詢'][文件名][數據庫] = '{} 行'.format(len(data))

將數據添加到 Python 字典中。

我已經嘗試使用嵌套的 PSCustomObjects,但是當在同一個數據庫上運行不同的查詢時我最終會發生沖突,因此它嘗試使用相同的鍵向 PSCustomObject 添加一個值。 我想知道在 PowerShell 中是否有一種很好的“本機”方式來做到這一點,就像在 Python 中一樣。

原來我只是個白痴,不記得如何使用 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" 

如果所需的最終結果是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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM