我想为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文件中准备外部列表并将其中的值解析为字符串?
答案 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"
等
希望可以解释将对象转换为字符串的情况。