Saya ingin menambahkan nilai tag yang sama untuk semua VM di setiap grup sumber daya di Azure.

Saya sudah menyiapkan skrip, tetapi PS tidak ingin melanjutkan ini, karena masalah konversi objek ke string.

$VMs = Get-AzureRmVM

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

Tetapi bagaimana saya bisa melakukan loop, ketika ia meminta string, ketika objek yang diuraikan ke loop harus jelas objek? Apakah saya terpaksa menyiapkan daftar eksternal dalam file txt dan mengurai nilai dari sana sebagai string?

1
lubierzca 1 April 2019, 13:18

1 menjawab

Jawaban Terbaik

Di dalam loop ForEach-Object, Anda harus menggunakan variabel otomatis $_ untuk menargetkan satu objek tertentu. Sekarang Anda mengirim array ke cmdlet Get-AzureRmResource:

$VMs = Get-AzureRmVM

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

Misalkan Anda memiliki tiga VM yang Anda dapatkan dari $VMs = Get-AzureRmVM
(Saya memalsukan itu di sini menggunakan array objek [PSCustomObject])

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

Kemudian melakukan $VMs.Name menghasilkan (Object[]) array 'VM1','VM2','VM3'

Dan melakukan $VMs.ResourceGroupName menghasilkan array 'VM1_Resource','VM2_Resource','VM3_Resource'

Namun di dalam loop, variabel $_ hanya mewakili satu dari VM ini pada gilirannya, jadi untuk iterasi pertama $_.Name adalah string "VM1" dll.

Harapan yang menjelaskan objek Anda ke konversi string.

1
Theo 1 April 2019, 11:50