仅当一组值时添加方括号



我正在使用这个 scrip 通过 Zabbix:https://b-blog.info/en/monitoring-azure-resources-with-zabbix 进行 Azure 监控.html

如果输出中只有一个 SQL 数据库:

{"data":{
  "{#SERVERNAME}": "mojsql",
  "{#ID}": "/subscriptions/11111-222222/resourceGroups/rg/providers/Microsoft.Sql/servers/mojsql/databases/mojabaza",
  "{#DATABASENAME}": "mojabaza",
  "{#RGNAME}": "rg"
}
}

如果有多个数据库,则输出为:

{"data":[
  {
    "{#DATABASENAME}": "mojabaza",
    "{#SERVERNAME}": "mojsql",
    "{#RGNAME}": "rg",
    "{#ID}": "/subscriptions1111-22222/resourceGroups/rg/providers/Microsoft.Sql/servers/mojsql/databases/mojabaza"
  },
  {
    "{#DATABASENAME}": "mojabaza1",
    "{#SERVERNAME}": "mojsql",
    "{#RGNAME}": "rg",
    "{#ID}": "/subscriptions/11111-22222/resourceGroups/rg/providers/Microsoft.Sql/servers/mojsql/databases/mojabaza1"
  }
]
}

注释方括号会自动添加。

问题是如果资源组中只有一个数据库,那么我必须添加方括号才能在zabbix中查看数据库

'{"data":' + '[' + $($result | ConvertTo-Json) + ']' + "`n}";

如果有多个数据库,则添加双方括号,Zabbix显示错误。

如果一个输出然后添加方括号,是否可以编写一个条件,例如

如果 $($results(=1,则

'{"data":' + '[' + $($result | ConvertTo-Json) + ']' + "`n}";

'{"data":' + $($result | ConvertTo-Json)  + "`n}";

您的用例正是 PowerShell 的数组子表达式运算符 @() 而设计的:

'{"data":' + (ConvertTo-Json @($result))  + "`n}"

将命令包装在 @(...) 中可以保证其输出是一个数组

换句话说:

  • 如果输出已经是一个数组(集合(,那么粗略地说,它将被单独保留(从技术上讲,通常会创建输出数组的副本(。

  • 如果不是,则将其包装在数组中,作为该数组的唯一元素。

此外,为了让ConvertTo-Json看到数组本身,您不能使用管道,而是将其作为参数传递

由于管道以隐式方式解包(展开(参数,因此以下两个命令是相同的

$result | ...
@($result) | ....  # !! identical

最新更新