首页 > 解决方案 > 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) 输出。 带有空 GiB 的完整片段输出

编辑 5:谢谢大家——响应是一个 json 数组,所以我引用了错误的值。正确的代码片段应该是:

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

我将研究是否可以修改该查询以返回更清晰的结果,但是我在尝试格式化结果时立即进行的搜索让我回到了在 powershell 中使用 ConvertFrom-Json。

标签: azurepowershellformatting

解决方案


我做错了什么?

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] / 1024Sage 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)。学到更多


推荐阅读