Abstract
Come on guys!! Seriously?
After this successful post of Azure
Virtual Machine – Frequently asked questions – not easily answered I got almost
54+ requests/ comments/ emails asking specifically for a blog post on sharing script
for “Deleting Azure File Storage Directory using PowerShell”.
Not sure why people felt this is hard to write a
PowerShell script. Well, this post is about the same topic and at the end of
post you will know how to delete Azure file storage Directory and Files using
PowerShell scripting.
You must have read the word in title “Secret sauce of Recursion”;
about that later in the post below.
Lets go!
What is big deal in deleting Azure File Storage Directory and Files?
Well, you may think this as straight forward PowerShell.
I also thought the same way until I actually tried for it.
As a best practice, before trying anything from
PowerShell I always do the same task using Azure Portal. So for deleting Azure
Files I went on to the portal. Created a storage account of type v2; and then
created a File storage of 10GB as shown in the screenshot below. At this point
the file share is empty.
Note – Focus on Blue box
and blue underline; I wrote this blog at 2AM in the night. This is how I am
getting attached to my blog after my wife.
Then I created a directory and uploaded few files within
directory and few files directly in share and few directories inside the root
directory and then again few files.
Note - If you have not
understood above sentence; then blame 2AM time.
So my directory structure looks as below on Azure File storage
share –
Yellow boxes are directories, blue boxes are files and
green box is the actual file share inside which all of this is present. I tried
to delete the directory wwwroot from the portal UI and I got below message.
This means I will have to delete each and every file
present in the directory of my file share. If there is cascading of directories
[directory within directory] then each of the directory will have to be made
empty first and then delete each of the directory one by one and then the actual
directory I want to delete.
This is big deal task and no wonder people are finding
it difficult in PowerShell. As of now there is no single command by which you
can delete directory including everything within it. So if I want to retain my
file share but delete everything within it; I must empty all the directories.
What is my way out?
Well, you need to traverse through each of the directory
and make it empty. So you might be thinking for for-each loop in PowerShell to
do it. You are correct. But only for-each or for loop will not help you win the
war. You need super power called as “RECURSION”. Write a recursive function in
PowerShell and we should be able to win the war.
Why people find it difficult to write RECURSIVE functions?
People of my generation [people who started career
between 2006 to 1012 year]who had started their programming career in C, C++,
micro-controller programming will never find recursion difficult. Because the
very first program we had build was Factorial number and it is product of all
integers from 1 to n. For example factorial of 5 is 5 x 4 x 3 x 2 x 1 = 120.
This classic problem can be solved by recursion effectively.
Recursion is basic programming technique you can use in
many languages including PowerShell, in which a function/ method calls itself
to solve some problem. A method/ function that uses this technique is called as
“Recursive function”. There are many problems that can be solved only by recursion.
To empty azure file directories we need recursion in
PowerShell.
I have seen most of the new comers who starting their
career in IT fields directly jump to Artificial Intelligence and Machine
learning programming. More of less basics of programming may get missed like
data structures, recursions etc.. I asked the year of experience to many people
who demanded to write this PowerShell to delete Azure files directories and
files and no surprise most of them were in the range of 4 to 6 years of
experience.
Anyways no hard feelings!
Let us build PowerShell to delete Azure file storage
directories and files recursively.
Define variable and create Azure Storage context
I am using latest Azure PowerShell module.
We need to define the variables for storage account
details and then create the context for storage account. Context is an
important steps as for every operation you perform against any of the service
in Azure storage context should be passed in PowerShell commands.
#define varibales
$StorageAccountName = "YourStorageAccountName"
$StorageAccountKey = "YourStorageAccountPrimaryKey"
$AzShare = "kunalshare – you write your file share name here"
$AzDirectory = "LatestPublish"
#create primary region storage context
$ctx = New-AzStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
$ctx.ToString()
#Check for Share Existence
$S = Get-AzStorageShare -Context $ctx -ErrorAction SilentlyContinue|Where-Object {$_.Name
-eq $AzShare}
Get the directory name and call for delete function
Now as per the directory hierarchy in above diagram; you
can see that inside File Share I have a root directory called as “LatestPublish”
and all other files/ directories are present inside it.
So I want to delete “LatestPublish” folder. So let us retrieve
the reference for the folder and then call delete recursive function.
# Check for directory
$d = Get-AzStorageFile -Share $S -ErrorAction SilentlyContinue|select Name
if ($d.Name -notcontains $AzDirectory)
{
# directory is not
presetn; no action to be performed
}
else
{
$dir = Get-AzStorageFile -Share $s -Path $AzDirectory
RemoveFileDir $dir $ctx
#Calling function to remove directory.
}
Recursive function to remove directories
In above code of getting root directory we are calling a
function named as RemoveFileDir.
Let us write this function.
function RemoveFileDir ([Microsoft.Azure.Storage.File.CloudFileDirectory] $dir, [Microsoft.Azure.Commands.Common.Authentication.Abstractions.IStorageContext] $ctx)
{
$filelist = Get-AzStorageFile -Directory $dir
foreach ($f in $filelist)
{
if ($f.GetType().Name
-eq "CloudFileDirectory")
{
RemoveFileDir $f $ctx
#Calling the same function again. This is
recursion.
}
else
{
Remove-AzStorageFile -File $f
}
}
Remove-AzStorageDirectory -Directory $dir
}
In above function, we are receiving the root directory object
to be deleted and storage context as parameter. Then we use for loop to
traverse through the received directory object and see if there any more
directories. If there is a directory found then we call the same function in recursion
mode; until we reaches to last directory/ file present in the hierarchy. Once
we reach to last item then we delete it.
Download entire source code
Download the entire source code of deleting Azure file
directories from GitHub - https://github.com/kunalchandratre1/DeleteAzureFilesDirectoriesPowerShell
Bonus tip
If you delete file share from the azure portal;
everything within that gets deleted automatically and you don’t have to indulge
yourself in to PowerShell. However if you want to delete selected directories
and files from File share then PowerShell is the only way or do it manually
from portal.
Conclusion
Hope this blog helped you t get working Azure PowerShell
script for deleting Azure file storage directory and files recursively. Please
feel free to add/ update your comments. Thanks.
A humble request!
Internet is creating a lot of digital garbage. If you feel this a quality blog and someone will definitely get benefitted, don't hesitate to hit share button present below. Your one share will save many precious hours of a developer. Thank you.
EXCELLENT post,thanks for sharing!
ReplyDeletesimply awesome
ReplyDelete