继续上一小节,清空快照比删除某组虚拟机磁盘快照要更容易一些,不需要进行区分或者分区,我们遍历所有虚拟机的磁盘,列出全部快照删除即可,脚本如下:
param( [Parameter(Mandatory = $true)] [string]$SubscriptionName, [Parameter(Mandatory = $true)] [string]$ResourceGroupName, [Parameter(Mandatory = $true)] [string]$VMName ) Function PrepareBlobContext($vhdAbsoluteUri) { $StorageAccountName = $vhdAbsoluteUri.Substring(8, $vhdAbsoluteUri.IndexOf(".blob.core.chinacloudapi.cn") - 8); #length of "https://" is 8 $ContainerPathIndex = $vhdAbsoluteUri.IndexOf("blob.core.chinacloudapi.cn/") + 27; $ContainerName = $vhdAbsoluteUri.SubString($ContainerPathIndex, $vhdAbsoluteUri.IndexOf('/', $ContainerPathIndex) - $ContainerPathIndex); $BlobName = $vhdAbsoluteUri.SubString($vhdAbsoluteUri.LastIndexOf('/') + 1); $storageAccount = Get-AzureRmStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageAccountName; $storageContext = $storageAccount.Context; $blobClient = $storageContext.Context.StorageAccount.CreateCloudBlobClient(); $blobContainer = $blobClient.GetContainerReference($ContainerName); $blob = $blobContainer.GetBlockBlobReference($BlobName); return $blob; } Function DeleteAllSnapshots($rgName, $vmName) { $vm = Get-AzureRmVM -ResourceGroupName $rgName -Name $vmName -WarningAction Ignore; $hasSnapshot = $false; $osDiskUri = $vm.StorageProfile.OsDisk.Vhd.Uri; $blob = PrepareBlobContext $osDiskUri; $osDiskSnapshotList = @(GetSnapshotListByBlob $blob); $osDiskSnapshotPropertiesList = @(GetSnapshotPropertiesList $osDiskSnapshotList $blob); $dataDiskSnapshotLists = @(); $dataDiskSnapshotPropertiesLists = @(); foreach($dataDiskUri in $vm.StorageProfile.DataDisks.Vhd.Uri) { $blob = PrepareBlobContext $dataDiskUri; $dataDiskSnapshotList = @(GetSnapshotListByBlob $blob); if ($dataDiskSnapshotList.Count -gt 0) { $hasSnapshot = $true; } $dataDiskSnapshotPropertiesList = @(GetSnapshotPropertiesList $dataDiskSnapshotList $blob); $dataDiskSnapshotLists += $null; $dataDiskSnapshotLists[$dataDiskSnapshotLists.Count - 1] = $dataDiskSnapshotList; $dataDiskSnapshotPropertiesLists += $null; $dataDiskSnapshotPropertiesLists[$dataDiskSnapshotPropertiesLists.Count - 1] = $dataDiskSnapshotPropertiesList; } if ($osDiskSnapshotList.Count -eq 0 -and !$hasSnapshot) { Write-Host "Virtual Machine has no snapshots." -ForegroundColor Yellow; return; } Write-Host "The following snapshots will be deleted:" -ForegroundColor Yellow; foreach ($osDiskSnapshotProperties in $osDiskSnapshotPropertiesList) { Write-Host ("{0}({1})" -f $osDiskSnapshotProperties.SnapshotUri, $osDiskSnapshotProperties.SnapshotTime) -ForegroundColor Red; } foreach ($dataDiskSnapshotPropertiesList in $dataDiskSnapshotPropertiesLists) { foreach ($dataDiskSnapshotProperties in $dataDiskSnapshotPropertiesList) { Write-Host ("{0}({1})" -f $dataDiskSnapshotProperties.SnapshotUri, $dataDiskSnapshotProperties.SnapshotTime) -ForegroundColor Red; } } If ($PSCmdlet.ShouldContinue("Confirm?", "=== Confirm delete Opeartion ===")) { foreach ($osDiskSnapshot in $osDiskSnapshotList) { $osDiskSnapshot.Delete(); } foreach ($dataDiskSnapshotList in $dataDiskSnapshotLists) { foreach ($dataDiskSnapshot in $dataDiskSnapshotList) { $dataDiskSnapshot.Delete(); } } Write-Host "Done"; } else { Write-Host "Canceled"; } } Function GetSnapshotListByBlob($blob) { return $blob.Container.ListBlobs($blob.Name, $true, "Snapshots") | Where {$_.SnapshotTime -ne $null}; } Function GetSnapshotPropertiesList($Snapshots, $blob) { $Index = 0 $SnapshotPropertiesList = @() Foreach($Snapshot in $Snapshots) { $Index++ $SnapshotPropertiesList += [PSCustomObject]@{ID = $Index BlobName = $blob.Name SnapshotTime = $Snapshot.SnapshotTime SnapshotUri = $Snapshot.Uri} } return $SnapshotPropertiesList; } #$Cred = New-Object System.Management.Automation.PSCredential("XXXXXXXX@XXXXXXXX.partner.onmschina.cn", (ConvertTo-SecureString "XXXXXXXX" -AsPlainText -Force)); #[void](Login-AzureRmAccount -EnvironmentName AzureChinaCloud -Credential $Cred); [void](Select-AzureRmSubscription -SubscriptionName $SubscriptionName); DeleteAllSnapshots $ResourceGroupName $VMName;调用方法:
PS> &.\[ARM]delete_all_snapshots_for_VM.ps1 -SubscriptionName <Subscription Name> -ResourceGroupName <Resource Group Name> -VMName <VM Name>
脚本执行结果:
