You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell的Format-Table表达式无法对PSCustomObject成员做除法如何解决

PowerShell查询Azure存储账户已用容量单位转换异常问题

我正在编写命令获取Azure中所有存储账户的总已用存储容量,查询返回的结果单位是字节,我想将其转换为和Azure UI展示一致的Gibibytes(GiB)单位。

问题复现

当前报错脚本

(az storage account list --query "[].{Name:name,ResourceGroup:resourceGroup}" | 
    ConvertFrom-Json) |
    % {$i=0}
        {az monitor metrics list 
            --resource $_[$i].name 
            --resource-type Microsoft.Storage/storageAccounts 
            --resource-group $_[$i].resourceGroup 
            --metrics 'UsedCapacity' 
            --interval PT1H 
            --query "{Id:value[].id,ResourceGroup:value[].resourceGroup,UsedCapacity:value[].timeseries[].data[].average}" |
    ConvertFrom-Json} |
    Format-Table 
        @{Label="Resource";Expression={$_.Id.Split("/")[8]}},
        ResourceGroup,
        @{Label="Gibibytes";Expression={If(($_.UsedCapacity -eq null) -or ($_UsedCapacity -eq 0)){0} Else {([int]$_.UsedCapacity/1.074e+9)}}}

我查阅了官方文档和其他相关帖子,但始终没搞清楚为什么做除法时返回空白项。我特意添加了判断0和null的条件,以为是空值导致的错误。如果去掉除法逻辑,数值可以正常返回。
请问为什么表达式块内的数学运算无法正常执行?
注:我对PowerShell相关功能还不熟悉,可能遗漏了基础知识点。

正常运行的对照脚本(去掉除法逻辑)

(az storage account list --query "[].{Name:name,ResourceGroup:resourceGroup}" | ConvertFrom-Json)| % {$i=0}{az monitor metrics list --resource $_[$i].name --resource-type Microsoft.Storage/storageAccounts --resource-group $_[$i].resourceGroup --metrics 'UsedCapacity' --interval PT1H --query "{Id:value[].id,ResourceGroup:value[].resourceGroup,UsedCapacity:value[].timeseries[].data[].average}"| ConvertFrom-Json} | Format-Table @{Label="Resource";Expression={$_.Id.Split("/")[8]}},ResourceGroup,@{Label="Gibibytes";Expression={$_.UsedCapacity}};

补充输出参考

az monitor metrics list返回JSON示例

{
  "Id": [
    "/subscriptions/16b5877d-2988-4a0d-b207-760d5168ef3d/resourceGroups/{MyResourceGroupName}/providers/Microsoft.Storage/storageAccounts/{MyStorageAccountName}/providers/Microsoft.Insights/metrics/UsedCapacity"
  ],
  "ResourceGroup": [
    "{MyResourceGroupName}"
  ],
  "UsedCapacity": [
    1442090.0
  ]
}

存储账户列表查询输出示例

[
  {
    "Name": "{storageAccount1}",
    "ResourceGroup": "{resourceGroup1}"
  },
  {
    "Name": "storageAccount2",
    "ResourceGroup": "{resourceGroup1}"
  },
  {
    "Name": "storageAccount3",
    "ResourceGroup": "{resourceGroup2}"
  }
]

问题原因及解决方案

返回的UsedCapacity字段是JSON数组类型,直接对数组做数值运算会失败,需要取数组的第一个元素进行计算。
修正后的表达式代码如下:

{([int]$_.UsedCapacity[0]/1.074e+9).ToString()+" GiB"}

后续可调整Azure CLI的查询语句,直接返回单值而非数组,简化后续PowerShell处理逻辑。


内容的提问来源于stack exchange,提问作者Emeria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:36:01