一次将标签分配给所有虚拟机

时间:2019-04-01 10:18:47

标签: azure powershell automation tags

我想为Azure中每个资源组中的所有VM添加相同的标记值。

我已经准备了一个脚本,但是PS不想继续进行此操作,因为对象到字符串的转换很麻烦。

$VMs = Get-AzureRmVM

$VMs | Foreach-Object {
$t = Get-AzureRmResource -ResourceName $VMs.Name -ResourceGroupName $VMs.ResourceGroupName
Set-AzureRmResource -Tag @{ Funding="..."} -ResourceId $t.ResourceId -Force
}

但是,当它要求一个字符串时,当解析为循环的对象必须明显是对象时,我该怎么做呢?我是否被迫在txt文件中准备外部列表并将其中的值解析为字符串?

1 个答案:

答案 0 :(得分:1)

ForEach-Object循环中,应使用自动变量$_来定位该特定对象。现在,您将数组发送到Get-AzureRmResource cmdlet:

$VMs = Get-AzureRmVM

$VMs | Foreach-Object {
    $t = Get-AzureRmResource -ResourceName $_.Name -ResourceGroupName $_.ResourceGroupName
    Set-AzureRmResource -Tag @{ Funding="..."} -ResourceId $t.ResourceId -Force
}

假设您有三台从$VMs = Get-AzureRmVM回来的VM
(我在这里使用[PSCustomObject]对象的数组来伪造它)

$VMs = @(
    [PSCustomObject]@{Name = 'VM1'; ResourceGroupName = 'VM1_Resource'},
    [PSCustomObject]@{Name = 'VM2'; ResourceGroupName = 'VM2_Resource'}
    [PSCustomObject]@{Name = 'VM3'; ResourceGroupName = 'VM3_Resource'}
)

然后执行$VMs.Name将得到(Object [])数组 'VM1','VM2','VM3'

执行$VMs.ResourceGroupName会得到一个数组 'VM1_Resource','VM2_Resource','VM3_Resource'

但是,在循环内部,变量$_仅代表这些VM中的一个,因此对于第一次迭代$_.Name字符串 "VM1"

希望可以解释将对象转换为字符串的情况。