我正在使用此脚本对Zabbix进行Azure监视:https://b-blog.info/en/monitoring-azure-resources-with-zabbix.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}";
答案 0 :(得分:3)
您的用例正是PowerShell的array subexpression operator, @()
设计用于的用途:
'{"data":' + (ConvertTo-Json @($result)) + "`n}"
在@(...)
中包装命令,以保证其输出是 array 。
换句话说:
如果输出已经是一个数组(集合),那么从广义上讲,它是一个单独的(从技术上讲,通常会创建输出数组的副本)。
如果不是,则将其包装在数组中,作为该数组的唯一元素。
此外,为了使ConvertTo-Json
能够看到数组,您不能使用 pipeline 而是将其作为 argument :
由于管道 unwraps (展开)参数是隐式的,因此以下两个命令是相同:
$result | ...
@($result) | .... # !! identical