我正在使用这个 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