【问题标题】:Add square bracket only if one set of values [duplicate]仅当一组值时才添加方括号[重复]
【发布时间】:2018-08-08 21:45:57
【问题描述】:

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

【问题讨论】:

  • If ($result.length -eq 1){...} else {...}
  • @LotPings,它有效,谢谢!!

标签: powershell


【解决方案1】:

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

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

@(...) 中包装一个命令保证它的输出是一个数组

换句话说:

  • 如果输出已经一个数组(集合),松散地说,它是单独存在的(从技术上讲,通常会创建输出数组的副本)。

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

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

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

$result | ...

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

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 2017-09-10
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多