在前面的文章中介紹瞭如何建立Azure Blob Snapshot。那篇文章中建立的腳本思路是:遍歷全部Storage Account,找到全部vhd文件,進行Snapshot的建立。測試
但這種方式不夠嚴謹,有多是已經刪除了的VM,不須要再進行Snapshot的建立工做。spa
本文將採用獲取Subscription下全部VM,若是這臺虛擬機是運行狀態,就去獲得其OS Disk和Data Disk,對其進行建立Snapshot的工做。code
具體的腳本以下:blog
1 $vms = Get-AzureVM 2 foreach ($vm in $vms) 3 { 4 if($vm.Status -eq "ReadyRole") 5 { 6 $osblobname = ($vm.VM.OSVirtualHardDisk).MediaLink.ToString().Split("/")[-1] 7 $osblobcontainer = ($vm.VM.OSVirtualHardDisk).MediaLink.ToString().Split("/")[-2] 8 $osblobsa = ($vm.VM.OSVirtualHardDisk).MediaLink.ToString().Split("/")[-3].Split(".")[0] 9 10 $storagekey = (Get-AzureStorageKey -StorageAccountName $osblobsa).Primary 11 $ctr = New-AzureStorageContext -StorageAccountName $osblobsa -StorageAccountKey $storagekey -Environment AzureChinaCloud 12 13 $blob = Get-AzureStorageBlob -Container $osblobcontainer -Context $ctr -Blob $osblobname 14 $blob.ICloudBlob.CreateSnapshot() 15 #write-host $blob.Name 16 17 $count = $vm.VM.DataVirtualHardDisks.Count 18 19 for($i=0;$i -lt $count;$i++) 20 { 21 $datablobname = ($vm.VM.DataVirtualHardDisks)[$i].MediaLink.ToString().Split("/")[-1] 22 $datablobcontainer = ($vm.VM.DataVirtualHardDisks)[$i].MediaLink.ToString().Split("/")[-2] 23 $datablobsa = ($vm.VM.DataVirtualHardDisks)[$i].MediaLink.ToString().Split("/")[-3].Split(".")[0] 24 $storagekey = (Get-AzureStorageKey -StorageAccountName $datablobsa).Primary 25 $ctr = New-AzureStorageContext -StorageAccountName $datablobsa -StorageAccountKey $storagekey -Environment AzureChinaCloud 26 27 $blob = Get-AzureStorageBlob -Container $datablobcontainer -Context $ctr -Blob $datablobname 28 $blob.ICloudBlob.CreateSnapshot() 29 #write-host $blob.name 30 } 31 } 32 }
測試時,能夠把ip
$blob.ICloudBlob.CreateSnapshot()
標註; 虛擬機
把it
#write-host $blob.name
撤銷標註。io
若是正確,能夠打印全部OS Disk和Data Disk的文件名。class