json - 使用 Powershell 将数组添加到 JSON
问题描述
我正在尝试使用 powershell 设置 JSON 文件,但 vm 一直出现在单独的行中。
这是我使用的代码:
$arrayRg = "VmResGrp"
$vms = vmname
$arrayvms = @(Get-AzureRmVM -ResourceGroupName $arrayRg | ? {$_.Name -like "*$vms*"}) | select Name
$data = Get-Content -Path "$updatepath\$encryptParam" -raw | ConvertFrom-Json
$data.parameters.recoveryServicesVaultName.value = "rsvname01"
$data.parameters.recoveryServicesVaultBackupPolicyName.value ="defaultPolicy"
$data.parameters.recoveryServicesVaultResourceGroup.value = "rg-rsvgrp"
$data.parameters.VMNames.value = [array]$arrayvms
$data | ConvertTo-Json -Depth 9 | % { [System.Text.RegularExpressions.Regex]::Unescape($_) } |set-content -Path "$updatedpath\$encryptParam"
我得到的输出是:
"VMNames": {
"value": [
{
"Name": "vmr1ssr1"
},
{
"Name": "vmr1ssr2"
},
{
"Name": "vmr1ssr3"
}
]
}
我想要得到的是:
"VMNames": {
"value": [
{
"vmr1ssr1"
"vmr1ssr2"
"vmr1ssr3"
}
]
}
之后我尝试-expandProperty
在第 3 行使用,select Name
但这根本没有给我任何值的输出。
谁能看到我哪里出错了?
提前致谢 :)
解决方案
我很确定您想要的输出实际上是这样的:
{
"VMNames": {
"value": [
"vmr1ssr1",
"vmr1ssr2",
"vmr1ssr3"
]
}
}
不同之处在于每个 VM 名称后面的逗号。您必须对代码进行的唯一更改是扩展Name
属性,而不仅仅是选择它。就目前而言,你有这条线:
$arrayvms = @(Get-AzureRmVM -ResourceGroupName $arrayRg | ? {$_.Name -like "*$vms*"}) | select Name
这会为您留下 3 个具有 1 个属性的对象,Name
. 该属性的值是此处的相关内容,因此您不仅Select Name
要使用该-ExpandProperty
参数,还可以将该行更改为:
$arrayvms = @(Get-AzureRmVM -ResourceGroupName $arrayRg | ? {$_.Name -like "*$vms*"}) | select -expand Name
现在你的 JSON 看起来就像我上面的那样。
编辑:如果-ExpandProperty
不起作用,您可以让 PowerShell 循环遍历每个对象并使用ForEach-Object
循环输出属性值。我在这里使用较短的别名%
:
$arrayvms = @(Get-AzureRmVM -ResourceGroupName $arrayRg | ? {$_.Name -like "*$vms*"}) | % Name
推荐阅读
- google-sheets - 如果在谷歌表格中修改了值,则更改单元格颜色
- sql - 将日期转换为工作日,然后将其关联并求和
- html - 如何删除我的html页面两边的白边
- dialogflow-es - 处理“取消插槽填充对话框”
- azure - 如何将 Azure 分析服务模型推送到 azure devops git repo?
- vba - 搜索文本,在多个单元格中应用背景颜色
- sql - 如何根据不同列的全文搜索计算加权分数并在postgresql中求和?
- gitlab - 在 Gitlab CI 中读取 webhook 有效负载
- angular - 无法在 Angular 材质的材质对话框中传递数据
- android - 在获得即时证书并禁用证书检查后,仍然无法找到证书路径的信任锚