azure - Powershell 格式表表达式不允许划分 PsCustomObject 成员
问题描述
我一直在使用以下命令来检索 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)}}}
我一直在阅读文档和其他 SO 帖子,但无法弄清楚为什么我的部门在尝试分割时返回空白条目。我添加了条件来检查 0 和空值,认为这是一个空值错误。当我删除除法时,这些值会很好。
关于为什么我不能让数学在这个表达式块中工作的任何想法?
注意:我对所有这些 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
]
}
编辑 2:清理片段结构
编辑3:输出
(az storage account list --query "[].{Name:name,ResourceGroup:resourceGroup}" )
[
{
"Name": "{storageAccount1}",
"ResourceGroup": "{resourceGroup1}"
},
{
"Name": "storageAccount2",
"ResourceGroup": "{resourceGroup1}"
},
{
"Name": "storageAccount3",
"ResourceGroup": "{resourceGroup2}"
}
]
编辑 4:学习了如何语法高亮... 编辑 5:添加了输出示例——由于命名,大部分都被编辑了。唯一不起作用的是 Gibibytes (GiB) 输出。
编辑 5:谢谢大家——响应是一个 json 数组,所以我引用了错误的值。正确的代码片段应该是:
{([int]$_.UsedCapacity[0]/1.074e+9).ToString()+" GiB"}
我将研究是否可以修改该查询以返回更清晰的结果,但是我在尝试格式化结果时立即进行的搜索让我回到了在 powershell 中使用 ConvertFrom-Json。
解决方案
我做错了什么?
az CLI 命令的响应包含我没有正确引用的数组。我试图直接将数组用作 int 。
它是如何修复的?
我引用了第一个元素,然后继续我的划分。
@{Label="Gibibytes";
Expression={If(($_.UsedCapacity -eq $null)
-or ($_.UsedCapacity -eq 0)){0}
Else {([int]$_.UsedCapacity[0]/1.074e+9).ToString()+" GiB"}}}
它是如何解决的?
感谢@SagePourpre 指出我得到了一个对象数组,而不是返回的实际 int :
“检查你的 Json。UsedCapacity 不是一个 int,它是一个对象数组。因此,将你的语句从
$_.UsedCapacity / 1024
-$_.UsedCapacity[0] / 1024
Sage Pourpre”
感谢@Mclayton 更详细地指出上述内容,并补充说我可以通过调整我的查询来改进命令。
az monitor metrics list 的输出与 format-table 尝试执行的操作不匹配。az 命令将属性作为 json 中的数组返回 - 即 { "Id": [...], "ResourceGroup": [...], "UsedCapacity": [...] 所以你的格式表表达式是试图计算 @( 1442090.0 ) / 1024 而不是 1442090.0 / 1024。Format-Table 正在吞噬前者生成的异常,并改为显示空/空值。
附加提示 Microsoft 有内置的类型转换器,但它们似乎还不支持数据存储增量,1000 GB 与 1024 (GiB)。学到更多
推荐阅读
- oracle - 在 Oracle PLSQL 过程的输出中需要帮助
- logging - 日志中的 Wazuh 代理连接失败和损坏的有效负载错误
- web-scraping - AttributeError:“NoneType”对象没有属性“css”。试图刮掉旧的 reddit 但收到此错误
- spring - 如何将 2 个 DTO 转换为 1 个 DTO mapstruct
- javascript - 在 2020 年使用 chrome 网络语音 API 是否有任何真正的限制
- visual-studio-code - 为 VS Code / ts-node / ts-node-dev 指定备用 tsconfig.json
- python - 需要从图像中解析出不同类型的文本数据
- python - 如何在函数内使用机械化包登录网站?
- c - 创建整数列表并按升序打印它们的 C 程序
- rust - 是否可以通过命名参数来调用 Rust 中的函数?