[英]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.