首页 > 解决方案 > 使用 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但这根本没有给我任何值的输出。

谁能看到我哪里出错了?

提前致谢 :)

标签: jsonazurepowershell

解决方案


我很确定您想要的输出实际上是这样的:

{
    "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

推荐阅读