Добавляйте значения во вложенные объекты в PowerShell, как в 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"
    }
} }

(Игнорируйте указанную выше закрывающую скобку, она по какой-то причине не отформатируется здесь должным образом).

Я использую цикл foreach в PowerShell для последовательного выполнения каждого из этих запросов в зависимости от того, в каких базах данных они должны выполняться.

Я знаю, что в 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 (данные))

Для добавления данных в словари Python.

Я пробовал использовать вложенные объекты PSCustomObject, но у меня возникает конфликт, когда в одной базе данных выполняются разные запросы, поэтому он пытается добавить значение в PSCustomObject с тем же ключом. Я хотел бы знать, есть ли хороший «собственный» способ сделать это в PowerShell, как в Python.


person takeoff127    schedule 26.08.2020    source источник
comment
Полагаю, вы пробовали ConvertTo-Json из объекта PowerShell? PS C:\> $json.queries.query_c.database_a = "600 rows", а затем PS C:\> PS C:\> $json | ConvertTo-Json   -  person Andrew Ryan Davis    schedule 27.08.2020
comment
Можете ли вы показать код, который не работает из-за конфликтов ключей?   -  person Mathias R. Jessen    schedule 27.08.2020


Ответы (2)


Оказывается, я просто был немного идиотом и не помнил, как работать с объектами 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" 
person takeoff127    schedule 27.08.2020

Если требуемый конечный результат - файл Json, на самом деле нет необходимости работать со сложным (и довольно толстым) _ 2_ типов. Вместо этого вы можете просто использовать [HashTable] (или упорядоченный словарь, просто добавив префикс к хеш-таблице, например: [Ordered]@{...})

Чтобы преобразовать хэш-таблицы из файла Json, используйте ConvertFrom-Json _ 6_ параметр (введен в PowerShell 6.0). Чтобы создать шаблон (или просто понять формат PowerShell), вы можете использовать этот ConvertTo-Expression командлет:

$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
}

Meaning you can assign this template to $Options as follows:

$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
}
person iRon    schedule 27.08.2020