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
相关产品推荐
相关产品推荐

