如何从Get-AzureRmResourceGroup标记中检索键值对

时间:2016-01-27 19:25:14

标签: powershell azure azure-resource-manager

我有一个使用具有键值对的标签安排的资源组:" IncludeInSchedule":" true"

当我做Get-AzureRmResourceGroup -Name MyResourceGroup时,我看到:

ResourceGroupName : MyResourceGroup
Location          : northcentralus
ProvisioningState : Succeeded 
Tags              :
                    Name               Value
                    =================  ======
                    IncludeInSchedule  True
ResourceId        : /subscriptions/ea904806-082f-4ce5-9b66-288afd61f83e/resourceGroups/MyResourceGroup

当我尝试将标签中的值读入变量时,我会立即解开。它看起来像一个哈希表,但Get-AzureRmResourceGroup -Name MyResourceGroup | Get-Member Tags表明它是一个Hashtable数组,我正在读它吗?

Name MemberType Definition                 
---- ---------- ----------                 
Tags Property   hashtable[] Tags {get;set;}

如果我将Get-AzureRmResourceGroup的输出传输到Select-Object并展开tags属性,我得到:

Name  Value
===== =====
Value True      
Name  IncludeInSchedule

这不是我期望看到的,我期望看到的是:

IncludeInSchedule  True

此外,当我尝试将标记分配给变量以便我可以提取IncludeInSchedule值时,我没有看到任何值。

如何从中提取值?

2 个答案:

答案 0 :(得分:3)

根据微软的官方文档:Displaying Hash Tables

以下内容应该有效:

> (Get-AzureRmResourceGroup -Name MyResourceGroup).Tags.Value
True

您可以通过以下方式获取所有标签的密钥:

> (Get-AzureRmResourceGroup -Name MyResourceGroup).Tags.Keys
Value
Name

例如,我使用这种方式来访问虚拟机的正常运行时间,如下所示:

> $vm = Get-AzureRmVM -ResourceGroupName $rgName -Name $vmName
> $vm.Tags.UptimeMonday
24h

如果您与Microsoft的命名有任何命名冲突,他们会进一步声明:

  

如果密钥名称与HashTable类型的某个属性名称冲突,则可以使用PSBase访问这些属性。例如,如果键名是键,并且您想要返回键集合,请使用此语法

$hashtable.PSBase.Keys

答案 1 :(得分:0)

是的,Tags是由hashtable[]定义的哈希表数组(注意方括号)。

数组中的每个对象都是一个哈希表,如:

$t = @{ Name = "IncludeInSchedule"; Value = "True" }

$t

Name                           Value
----                           -----
Value                          True
Name                           IncludeInSchedule 

要从对象访问此内容,请使用:

$IncludeInSchedule = ((Get-AzureRmResourceGroup -Name MyResourceGroup).Tags | Where-Object { $_.Name -eq 'IncludeInSchedule'}).Value

#Or

$IncludeInSchedule = (Get-AzureRmResourceGroup -Name MyResourceGroup).Tags | Where-Object { $_.Name -eq 'IncludeInSchedule'} | ForEach-Object { $_.Value }

输出:

PS C:\Users\frode> $IncludeInSchedule
True