仅当一组值

时间:2018-08-08 21:45:58

标签: powershell

我正在使用此脚本对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}";

1 个答案:

答案 0 :(得分:3)

您的用例正是PowerShell的array subexpression operator, @()设计用于的用途:

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

@(...)中包装命令,以保证其输出是 array

换句话说:

  • 如果输出已经一个数组(集合),那么从广义上讲,它是一个单独的(从技术上讲,通常会创建输出数组的副本)。

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

此外,为了使ConvertTo-Json能够看到数组,您不能使用 pipeline 而是将其作为 argument

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

$result | ...

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