首页 > 解决方案 > 一次为所有虚拟机分配标签

问题描述

我想为 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 文件中准备外部列表并将那里的值解析为字符串?

标签: azurepowershellautomationtags

解决方案


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

$VMs = Get-AzureRmVM

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

假设您从三个虚拟机返回$VMs = Get-AzureRmVM
(我在这里使用 [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'

然而,在循环内部,变量$_只代表这些虚拟机中的一个,因此第一次迭代$_.Name是一个字符串 "VM1"等。

希望能解释你的对象到字符串转换的东西。


推荐阅读