If you have an Azure account and you want to download files out of azure storage either individually or a whole folder. This script is about how I was able to do this with Powershell.
First we need to login to azure and get a storage context. The StorageContext will require a key.
Add-AzureRmAccount -credential (get-credential) -tenantid yourid $key = (get-azurermstorageAccountkey -resourcegroupname myresourcegroup -name mystorageaccountName | where-object{$Psitem.keyname -eq 'key1'}).value $storageContext = New-AzureStorageContext -StorageAccountName "mystorage" -StorageAccountKey $key
Now that we have the storage context and key. Now we need to find the files that are in our AZURE File storage.
$content = get-azurestoragefile -storageaccountname "mystorage" -storageAccountkey $key
If we look at the contents of our $content variable we should see something similar to this:
Now that we have the content in a variable now we can begin the process of figuring out how to download each file. To start with to download a single file we need to use get-azureStorageFileContent
$content = get-azurestoragefile -storageaccountname "mystorage" ` -storageAccountkey $key get-azurestoragefilecontent -sharename "myshare" -path $content[0].uri.localpath ` -replace "$($content[0].share.name)/",'' -destination "c:\temp\" -context $storageContext
After much trial and error I found that in the object you get back from Azure there are two different Object types that you must check for:
Microsoft.WindowsAzure.Storage.File.FileDirectoryProperties
and the other type is:
Microsoft.WindowsAzure.Storage.File.CloudFile
By the class names you can see that one is a file and the other is a Directory. With that in mind now I can put this in a function that recursively calls itself to get all the contents.
function Get-AzureFiles { param([string]$shareName = 'mystorage', [object]$storageContext, [string]$downloadFolder, [string]$path) $content = get-azurestoragefile -sharename $sharename -Context $storagecontext -path $path| Get-AzureStorageFile foreach($c in $content) { $Parentfolder = $c.uri.segments[($c.uri.segments.count -2)] -replace '/','\' if(!(test-path $destination)) {mkdir $destination} $p = $c.uri.LocalPath -replace "$($c.share.name)/" ,'' if(Get-AzureStorageFile -ShareName $c.share.name -path $p -Context $storageContext ) { if($c.properties -is [Microsoft.WindowsAzure.Storage.File.FileDirectoryProperties]) { $d = [Microsoft.WindowsAzure.Storage.File.CloudFileDirectory]::new($c.uri.AbsoluteUri) #Get-AzureStorageFileContent -directory $d -ShareName $c.share.name -Destination "$destination$($c.name)" -Context $storageContext #-Path $p $path = $d.Uri.LocalPath -replace "/$sharename/" , "" $dest = $path -replace '/','\' "$($c.name) is a directory -- getting $downloadfolder\$dest files" if(!("$downloadfolder\$dest")) {mkdir "$downloadfolder\$dest"} Get-AzureFiles -shareName $shareName -storageContext $storageContext -path $path -downloadFolder "$downloadFolder\$dest" } elseif($c -is [Microsoft.WindowsAzure.Storage.File.CloudFile]) { Write-Output "downloading --- $destination$($c.name)" $destination = (($c.Uri.LocalPath -replace "/$sharename/" , "") -replace '/','\') $dest = "$downloadFolder\$destination" $dest $de = $dest -replace $c.name, "" if(!(test-path $de)) { mkdir $de } if(!(test-path $dest)) {Get-AzureStorageFileContent -ShareName $c.share.name -Path $p -Destination $dest -Context $storageContext }# -WhatIf} else { Write-Output "already downloaded --- $dest" } } } } }
Now if we call the function with we’ll get a downloaded copy of all the folders from the location that you specify in azure to your local host:
get-AzureFiles -sharename “myShare” -storageContext $storageContext -downloadfolder “C:\temp\azurefiles”
There you go now you have your files in a directory from azure. Stay tuned for my next article where I’ll show you how to upload these same files to an Azure application (kudu).
I hope this helps someone
Until then keep Scripting
Thom
Hi Thom,
Do you know if there is a way to get the content of file share in Azure and redirect it into variable? I’ve read that for blobs “.ICloudBlob.DownloadText()” but have no idea what can be used for file share. Cheers
LikeLike