Copying VHDs between private storage accounts
If you ever need to copy VHDs between two different storage account, you can use the PowerShell script below to do it in few steps:
Perform the copy
Firstly select the subscription you need to work with.
Select-AzureSubscription "MySubscriptionName"
Define the source VHD - authenticated container. You can get the vhd name and url from the portal
$srcUri = "https://mysubscription.blob.core.windows.net/vhds/yourvhdname.vhd"
Define the source Storage Account. This is where the vhd is currently located. The Private key can be acquired from the azure portal
$srcStorageAccount = "sourceStorageAccount"
$srcStorageKey = "GET KEY FROM PORTAL"
Define the destination Storage Account. This is where the vhd will be copied to. Again, the private key can be acquired from the azure portal
$destStorageAccount = "destinationStorageAccount"
$destStorageKey = "GET KEY FROM PORTAL"
Create the source storage account context
$srcContext = New-AzureStorageContext `
-StorageAccountName $srcStorageAccount `
-StorageAccountKey $srcStorageKey
Create the destination storage account context
$destContext = New-AzureStorageContext `
-StorageAccountName $destStorageAccount `
-StorageAccountKey $destStorageKey
Define the destination Container Name
$containerName = "vhds"
Create the container on the destination
New-AzureStorageContainer -Name $containerName -Context $destContext
Start the asynchronous copy - specify the source authentication with -SrcContext
$blob1 = Start-AzureStorageBlobCopy `
-srcUri $srcUri `
-SrcContext $srcContext `
-DestContainer $containerName `
-DestBlob "DestinationVhdName.vhd" `
-DestContext $destContext
Checking the status of the copy
The script below can be used to retrieve the status of the copy operation. First we define a $status variable and then we loop until the status changes to non-pending. This variable is also used to display/print the current status on the console.
Retrieve the current status of the copy operation
$status = $blob1 | Get-AzureStorageBlobCopyState
Print out status
$status
While($status.Status -eq "Pending"){
$status = $blob1 | Get-AzureStorageBlobCopyState
Start-Sleep 10
$status
}
Happy coding...