Azure.ToolKit.Storage.psm1

<#
.SYNOPSIS
Copy a blob from one storage account to another, accounts can be in different regions and subscriptions
 
.DESCRIPTION
Copy a blob from one storage account to another, accounts can be in different regions and subscriptions
 
.EXAMPLE
Copy-BlobToStorageAccountSync -SourceBlobName 'blobName `
                -SourceStorageAccount 'sourceStorageAccount' `
                -SourceContainer 'sourceContainer' `
                -SourceSubscription 'sourceSubscription' `
                -DestBlobName 'destBlobName' `
                -DestStorageAccount 'destStorageAccountName' `
                -DestContainer 'destContainer' `
                -DestSubscription 'destContainer'
#>

function Copy-BlobToStorageAccountSync
{
    param
    (
        [Parameter(Mandatory=$true)][string]$SourceBlobName,
        [Parameter(Mandatory=$true)][string]$SourceStorageAccount,
        [Parameter(Mandatory=$true)][string]$SourceContainer,
        [Parameter(Mandatory=$true)][string]$SourceSubscription,
        $DestBlobName = $SourceBlobName,
        [Parameter(Mandatory=$true)][string]$DestStorageAccount,
        [Parameter(Mandatory=$true)][string]$DestContainer,
        [Parameter(Mandatory=$true)][string]$DestSubscription,
        [switch]$Force
    )

    $blobCopy = Copy-BlobToStorageAccountASync `
            -SourceBlobName  $SourceBlobName `
            -SourceStorageAccount $SourceStorageAccount `
            -SourceContainer $SourceContainer `
            -SourceSubscription $SourceSubscription `
            -DestBlobName $DestBlobName `
            -DestStorageAccount $DestStorageAccount `
            -DestContainer $DestContainer `
            -DestSubscription $DestSubscription `
            -Force:$Force

    while(($blobCopy | Get-AzureStorageBlobCopyState).Status -eq "Pending")
    {
        Start-Sleep -s 30
        $blobCopy | Get-AzureStorageBlobCopyState
    }
}

<#
.SYNOPSIS
Copy a blob from one storage account to another asynchronously
 
.DESCRIPTION
Copy a blob from one storage account to another, accounts can be in different regions and subscriptions.
Returns an object that can be used to monitor the progress of the copy
 
.EXAMPLE
$copyTask = Copy-BlobToStorageAccountASync -SourceBlobName 'blobName `
                -SourceStorageAccount 'sourceStorageAccount' `
                -SourceContainer 'sourceContainer' `
                -SourceSubscription 'sourceSubscription' `
                -DestBlobName 'destBlobName' `
                -DestStorageAccount 'destStorageAccountName' `
                -DestContainer 'destContainer' `
                -DestSubscription 'destContainer'
 
if(($copyTask | Get-AzureStorageBlobCopyState).Status -eq "Success")
{
    # Copy complete
}
 
#>

function Copy-BlobToStorageAccountASync
{
    param
    (
        [Parameter(Mandatory=$true)][string]$SourceBlobName,
        [Parameter(Mandatory=$true)][string]$SourceStorageAccount,
        [Parameter(Mandatory=$true)][string]$SourceContainer,
        [Parameter(Mandatory=$true)][string]$SourceSubscription,
        $DestBlobName = $SourceBlobName,
        [Parameter(Mandatory=$true)][string]$DestStorageAccount,
        [Parameter(Mandatory=$true)][string]$DestContainer,
        [Parameter(Mandatory=$true)][string]$DestSubscription,
        [switch]$Force
    )

    # Source Storage Account Information
    Select-AzureSubscription -subscriptionName $SourceSubscription | Out-Null
    $sourceStorageAccountKey = (Get-AzureStorageKey -StorageAccountName $SourceStorageAccount).Primary 
    $sourceContext = New-AzureStorageContext �StorageAccountName $SourceStorageAccount -StorageAccountKey $sourceStorageAccountKey  

    # Destination Storage Account Information
    Select-AzureSubscription -subscriptionName $DestSubscription | Out-Null
    $destStorageAccountKey = (Get-AzureStorageKey -StorageAccountName $DestStorageAccount).Primary     
    $destinationContext = New-AzureStorageContext �StorageAccountName $DestStorageAccount -StorageAccountKey $destStorageAccountKey 

    # Create the destination container if it doesn't already exist
    $existingContainer = Get-AzureStorageContainer -Name $DestContainer -Context $destinationContext -ErrorAction SilentlyContinue
    if($null -eq $existingContainer)
    {
        New-AzureStorageContainer -Name $DestContainer -Context $destinationContext -ErrorAction Stop
    }

    # Copy the blob
    $blobCopy = $null
    if($force)
    {
        $blobCopy = Start-AzureStorageBlobCopy -DestBlob $DestBlobName `
                                -DestContainer $DestContainer `
                                -DestContext $destinationContext `
                                -SrcBlob $SourceBlobName `
                                -Context $sourceContext `
                                -SrcContainer $SourceContainer `
                                -Force `
                                -ErrorAction Stop
    }
    else
    {
        $blobCopy = Start-AzureStorageBlobCopy -DestBlob $DestBlobName `
                                -DestContainer $DestContainer `
                                -DestContext $destinationContext `
                                -SrcBlob $SourceBlobName `
                                -Context $sourceContext `
                                -SrcContainer $SourceContainer `
                                -ErrorAction Stop
    }

    $blobCopy
}

Export-ModuleMember 'Copy-BlobToStorageAccountSync'
Export-ModuleMember 'Copy-BlobToStorageAccountASync'