微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

就像在Python中一样,将值添加到PowerShell中的嵌套对象中

如何解决就像在Python中一样,将值添加到PowerShell中的嵌套对象中

我正在寻找使用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,'build_url': 'https://some-url.com','queries': {} }

,然后使用类似的内容

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

要将数据添加到Python字典中。

我尝试使用嵌套的PSCustomObjects,但是当在同一数据库上运行不同的查询时,我最终遇到冲突,因此它试图使用相同的Key向PSCustomObject添加值。我想知道是否有像Python中那样在PowerShell中有一种不错的“本机”方法来实现这一点。

解决方法

原来,我只是个白痴,不记得如何使用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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。