首页 > 解决方案 > 从对象中提取数组并进行计算

问题描述

我有这种对象:

在此处输入图像描述

如何提取每个配额并使用 used 进行计算?我试过这个

foreach($quota in $LKPQuotas.quotas) {
    foreach($zone in $quota) {
        $totalUsed += $zone.used 
    }
}

但这对我不起作用。$LKPQuotas等于$quotaand $zone,我不明白为什么。

我可以使用下面的代码手动进行计算,但我相信还有另一种方法。

foreach($zone in $LKPQuotas.quotas.volume_gigabytes_basic) {
    $volume_gigabytes_basic += $zone.used
}

请帮帮我。谢谢你们,注意安全,大流行真的很难。

标签: arrayspowershellobject

解决方案


创建测试数据:

$val = {Get-Random -Minimum 1000 -Maximum 2000}
$used = {Get-Random -Minimum 100 -Maximum 900}
$LKPQuotas = [PSCustomObject]@{
  quotas = [PSCustomObject]@{
    volume_gigabytes_basic = @(
      [PSCustomObject]@{value=&$val; used=& $used},
      [PSCustomObject]@{value=&$val; used=& $used},
      [PSCustomObject]@{value=&$val; used=& $used}
    )
    volume_gigabytes_fast = @(
      [PSCustomObject]@{value=& $val; used=& $used},
      [PSCustomObject]@{value=& $val; used=& $used},
      [PSCustomObject]@{value=& $val; used=& $used}
    )
    images_gigabytes = @(
      [PSCustomObject]@{used=& $used},
      [PSCustomObject]@{used=& $used},
      [PSCustomObject]@{used=& $used}
    )
    compute_cores = @(
      [PSCustomObject]@{sockets=1; cores=8},
      [PSCustomObject]@{sockets=4; cores=4}
    )
  }
}
$LKPQuotas | ConvertTo-Json

测试数据输出:

{
    "quotas":  {
                   "volume_gigabytes_basic":  [
                                                  "@{value=1225; used=123}",
                                                  "@{value=1746; used=274}",
                                                  "@{value=1747; used=409}"
                                              ],
                   "volume_gigabytes_fast":  [
                                                 "@{value=1252; used=404}",
                                                 "@{value=1325; used=438}",
                                                 "@{value=1048; used=820}"
                                             ],
                   "images_gigabytes":  [
                                            "@{used=613}",
                                            "@{used=690}",
                                            "@{used=278}"
                                        ],
                   "compute_cores":  [
                                         "@{sockets=1; cores=8}",
                                         "@{sockets=4; cores=4}"
                                     ]
               }
}

处理测试数据并获得结果:

$valprops = @{N='value'; E={[uint32]$_.value}},
            @{N='used'; E={[uint32]$_.used}}
$LKPQuotas.quotas.psobject.Properties |
  ForEach-Object -Process {$prop = $_.Name
                           $psobj = [ordered]@{Name=$prop}
                           $LKPQuotas.quotas.$prop |
                           Select-Object -Property $valprops |
                             Measure-Object -Property value,used -Sum |
                             ForEach-Object -Process {$psobj[$_.Property]=$_.Sum}
                           [PSCustomObject]$psobj}

结果输出:

Name                   value used
----                   ----- ----
volume_gigabytes_basic  4718  806
volume_gigabytes_fast   3625 1662
images_gigabytes           0 1581
compute_cores              0    0

推荐阅读