我在Azure管理cmdlet Get-UsageAggregates
中返回的结构中有一些Azure使用情况数据。这在Json类型的属性中有一些信息,我想从中提取子属性。
这些数据包含在变量$usage
中。如果我执行
$usage.UsageAggregations.properties |
select-object metercategory,metersubcategory,unit,quantity
,@{Name="resource"; Expression={$_.InstanceData }}
我得到一个像这样的对象列表:
MeterCategory : Storage
MeterSubCategory : Geo Redundant
Unit : GB
Quantity : 3.76344
resource : {"Microsoft.Resources":{"resourceUri":"/subscriptions/[GUID]/resourceGroups/default-storage-
northeurope/providers/Microsoft.ClassicStorage/storageAccounts/MyAccountName","location":"eunorth"}}
我希望看到“MyAccountName”而不是Json字符串。我怎么能这样做?
我尝试使用
$usage.UsageAggregations.properties |
select-object metercategory,metersubcategory,unit,quantity
,@{Name="resource";
Expression={$_.InstanceData |
ConvertFrom-Json |
select-object -Property Microsoft.Resources.resourceuri }}
但输出是
MeterCategory : Storage
MeterSubCategory : Geo Redundant
Unit : GB
Quantity : 3.76344
resource : @{Microsoft.Resources.resourceuri=}
在.value
之后添加resourceuri
也无济于事。
答案 0 :(得分:1)
您的问题的要点是如何从以下JSON字符串中提取字符串MyAccountName
(漂亮打印和简化):
$json = @'
{
"Microsoft.Resources": {
"resourceUri": "/subscriptions/[GUID]/resourceGroups/.../MyAccountName",
"location": "eunorth"
}
}
'@
将ConvertFrom-Json
与-split
运算符结合使用:
(($json | ConvertFrom-Json).'Microsoft.Resources'.resourceUri -split '/')[-1]
ConvertFrom-Json
将JSON字符串转换为具有顶级属性Microsoft.Resources
属性的自定义对象,该属性又是属性resourceUri
和{{1 }}
location
因此返回.'Microsoft.Resources'.resourceUri
JSON属性的值 - 请注意引用 resourceUri
的必要性,以确保其 embedded 'Microsoft.Resources'
被视为属性名称的一部分,而不是属性名称之间的分隔符。
.
按-split '/'
将值拆分为令牌,并将其作为数组返回。
/
引用该数组的 last 元素,在这种情况下为[-1]
。
至于您尝试的内容:
MyAccountName
不支持属性路径,只支持顶级属性名称 。
换句话说,您只能从输入对象中提取顶级属性;你无法深入研究它们。
因此,您可以提取顶级属性Select-Object
- 其名称恰好包含Microsoft.Resources
本身 - 但不是其 .
属性。
如果您尝试这样做,整个参数将被视为顶级属性名称,字面上名为resourceUri
。
如果输入对象没有此类属性,则输出对象的属性为创建,值为Microsoft.Resources.resourceUri
。 [1]
通常,使$null
提取属性值 - 而不是返回自定义对象的默认行为该属性,您必须使用Select-Object
而不是-ExpandProperty
。
请注意,如果 使用 -Property
,则问题会变得更加明显,因为PowerShell然后会报告错误(如果无法找到给定名称的-level属性 [1] :
-ExpandProperty
[1]但是,如果您尝试引用 <{1}}分隔字符串的组件,> $json | ConvertFrom-Json | Select-Object -ExpandProperty Microsoft.Resources.resourceUri
Select-Object : Property "Microsoft.Resources.resourceUri" cannot be found.
...
只需传递输入对象 -
见this GitHub issue。