SharePoint Online: Delete All Files and Sub-Folders from a Folder Recursively using PowerShell
Requirement: Empty a Folder in SharePoint Online document library by deleting all its files and Sub-Folders recursively.
PowerShell to Delete All Files and Sub-Folders from a SharePoint Online Folder
Let's delete a folder with subfolder and files from SharePoint Online.
PnP PowerShell to Empty Folder in SharePoint Online:
Here is the PnP PowerShell script to clear all files and sub-folders of a given folder in SharePoint Online document library.
To delete a folder in SharePoint Online document library, use: SharePoint Online: How to Delete a Folder using PowerShell?
The above script deletes folder with files in SharePoint Online! How about deleting a large folder with its files and sub-folders in batches to avoid any potential list view threshold exceeded issue?
PowerShell to Delete All Files and Sub-Folders from a SharePoint Online Folder
Let's delete a folder with subfolder and files from SharePoint Online.
#Load SharePoint CSOM Assemblies Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll" Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll" #Function to Delete all files and Sub-folders of a given Folder Function Empty-SPOFolder([Microsoft.SharePoint.Client.Folder]$Folder) { Try { #Get All Files from the Folder $Ctx = $Folder.Context $Files = $Folder.Files $Ctx.Load($Files) $Ctx.ExecuteQuery() #Iterate through each File in the Root folder Foreach($File in $Files) { #Delete the file $Folder.Files.GetByUrl($File.ServerRelativeUrl).Recycle() | Out-Null Write-host -f Green "Deleted File '$($File.Name)' from '$($File.ServerRelativeURL)'" } $Ctx.ExecuteQuery() #Process all Sub Folders of the given folder $SubFolders = $Folder.Folders $Ctx.Load($SubFolders) $Ctx.ExecuteQuery() Foreach($Folder in $SubFolders) { #Exclude "Forms" and Hidden folders If( ($Folder.Name -ne "Forms") -and (-Not($Folder.Name.StartsWith("_")))) { #Call the function recursively to empty the folder Empty-SPOFolder -Folder $Folder #Delete the folder $Ctx.Web.GetFolderById($Folder.UniqueId).Recycle() | Out-Null $Ctx.ExecuteQuery() Write-host -f Green "Deleted Folder:"$Folder.ServerRelativeUrl } } } Catch { write-host -f Red "Error:" $_.Exception.Message } } #Variables $SiteURL = "https://crescent.sharepoint.com/Sites/Marketing" $ServerRelativeUrl= "/Sites/Marketing/Project Documents/2018" Try { #Get Credentials to connect $Cred= Get-Credential #Setup the context $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL) $Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password) #Get the web from URL $Web = $Ctx.web $Ctx.Load($Web) $Ctx.executeQuery() #Get the Folder object by Server Relative URL $Folder = $Web.GetFolderByServerRelativeUrl($ServerRelativeUrl) $Ctx.Load($Folder) $Ctx.ExecuteQuery() #Call the function to empty Folder Empty-SPOFolder $Folder #Delete the given Folder itself Write-host -f Green "Deleting Folder:"$Folder.ServerRelativeUrl $Folder.Recycle() | Out-Null $Ctx.ExecuteQuery() } Catch { write-host -f Red "Error:" $_.Exception.Message }This PowerShell script deletes all files, sub-folders of a folder and then deletes the given folder too.
PnP PowerShell to Empty Folder in SharePoint Online:
Here is the PnP PowerShell script to clear all files and sub-folders of a given folder in SharePoint Online document library.
#Parameters $SiteURL = "https://crescent.sharepoint.com/sites/Marketing" $FolderSiteRelativeURL = "/Shared Documents/2018" #Connect to the Site Connect-PnPOnline -URL $SiteURL -Credentials (Get-Credential) #Get the web & folder $Web = Get-PnPWeb $Folder = Get-PnPFolder -Url $FolderSiteRelativeURL #Function to delete all Files and sub-folders from a Folder Function Empty-PnPFolder([Microsoft.SharePoint.Client.Folder]$Folder) { #Get the site relative path of the Folder If($Web.ServerRelativeURL -eq "/") { $FolderSiteRelativeURL = $Folder.ServerRelativeUrl } Else { $FolderSiteRelativeURL = $Folder.ServerRelativeUrl.Replace($Web.ServerRelativeURL,"") } #Delete all files in the Folder $Files = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -ItemType File ForEach ($File in $Files) { #Delete File Remove-PnPFile -ServerRelativeUrl $File.ServerRelativeURL -Force -Recycle Write-Host -f Green ("Deleted File: '{0}' at '{1}'" -f $File.Name, $File.ServerRelativeURL) } #Process all Sub-Folders $SubFolders = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -ItemType Folder Foreach($SubFolder in $SubFolders) { #Exclude "Forms" and Hidden folders If(($SubFolder.Name -ne "Forms") -and (-Not($SubFolder.Name.StartsWith("_")))) { #Call the function recursively Empty-PnPFolder -Folder $SubFolder #Delete the folder Remove-PnPFolder -Name $SubFolder.Name -Folder $FolderSiteRelativeURL -Force -Recycle Write-Host -f Green ("Deleted Folder: '{0}' at '{1}'" -f $SubFolder.Name, $SubFolder.ServerRelativeURL) } } } #Call the function to empty folder Empty-PnPFolder -Folder $Folder
To delete a folder in SharePoint Online document library, use: SharePoint Online: How to Delete a Folder using PowerShell?
The above script deletes folder with files in SharePoint Online! How about deleting a large folder with its files and sub-folders in batches to avoid any potential list view threshold exceeded issue?
#Config Variables $SiteURL = "https://crescent.sharepoint.com/sites/marketing" $ListName ="Branding" $FolderServerRelativeURL = "/sites/Marketing/Branding/2019" Try { #Connect to PnP Online Connect-PnPOnline -Url $SiteURL -UseWebLogin #Get All Items from Folder in Batch $ListItems = Get-PnPListItem -List $ListName -FolderServerRelativeUrl $FolderServerRelativeURL -PageSize 2000 | Sort-Object ID -Descending #Powershell to delete all files from folder ForEach ($Item in $ListItems) { Remove-PnPListItem -List $ListName -Identity $Item.Id -Recycle -Force Write-host "Removed File:"$Item.FieldValues.FileRef } } Catch { write-host "Error: $($_.Exception.Message)" -foregroundcolor Red }To delete multiple folders in SharePoint Online from a CSV file, use: Bulk Delete Folders from in SharePoint Online from a CSV using PowerShell?
Hi Salaudeen,
ReplyDeleteThe script worked perfectly for me.
But how we can run this for multiple top level folders in the library? Is there any way we can read folder names from CSV file and delete accordingly.
Thanks..
Sure, Here you go: SharePoint Online: Bulk Delete Folders using PowerShell
DeleteHello,
ReplyDeleteThanks for the script. Is it possible to delete in batches for huge folder in order to avoid list view threshold error when deleting in SharePoint Online
Sure, Post has been appended with the script to delete all files and sub-folders from given folder!
DeleteThanks for your reply. I tried to run the script but it got all files and folder in my Document library deleted even after specifying folder to be deleted. Please kindly help out
ReplyDeleteThanks, this is a great script! One suggestion is to update it so that it works with MFA, like you have for the delete multiple folders from a CSV file script.
ReplyDeleteSure, You can delete multiple folders from a CSV file! Post has been updated with a link to PowerShell script that bulk deletes folders from a CSV.
DeleteHi Salaudeen,
ReplyDeleteWhat is the best way to have it limit the recursive folder depth that it deletes from. For example, I know if I go 3 levels deep and delete the files and folders at that level it will not hit the view limit threshold and will run a lot faster than deleting thousands of individual files and folders at the lowest levels.
Any advise is appreciated.
I figured it out, This was my code:
ReplyDelete#Connect to the Site
Connect-PnPOnline -URL $SiteURL -UseWebLogin
#Get the web & folder
$Web = Get-PnPWeb
$Folder = Get-PnPFolder -Url $FolderSiteRelativeURL
$Int = 0
#Function to delete all Files and sub-folders from a Folder
Function Empty-PnPFolder([Microsoft.SharePoint.Client.Folder]$Folder,[int]$Int)
{
$Int = $Int + 1
#Get the site relative path of the Folder
If($Web.ServerRelativeURL -eq "/")
{
$FolderSiteRelativeURL = $Folder.ServerRelativeUrl
}
Else
{
$FolderSiteRelativeURL = $Folder.ServerRelativeUrl.Replace($Web.ServerRelativeURL,"")
}
#Delete all files in the Folder
$Files = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -ItemType File
ForEach ($File in $Files)
{
#Delete File
Remove-PnPFile -ServerRelativeUrl $File.ServerRelativeURL -Force -Recycle
Write-Host -f Green ("Deleted File: '{0}' at '{1}'" -f $File.Name, $File.ServerRelativeURL)
}
#Process all Sub-Folders
$SubFolders = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -ItemType Folder
Foreach($SubFolder in $SubFolders)
{
#Exclude "Forms" and Hidden folders
If(($SubFolder.Name -ne "Forms") -and (-Not($SubFolder.Name.StartsWith("_"))) -and ($Int -le 3))
{
#Call the function recursively
Empty-PnPFolder -Folder $SubFolder -Int $Int
#Delete the folder
Remove-PnPFolder -Name $SubFolder.Name -Folder $FolderSiteRelativeURL -Force -Recycle
Write-Host -f Green ("Deleted Folder: '{0}' at '{1}'" -f $SubFolder.Name, $SubFolder.ServerRelativeURL)
}
}
}
#Call the function to empty folder
Empty-PnPFolder -Folder $Folder -Int $int
Hi, I keep getting the following error:
ReplyDeleteError: A parameter cannot be found that matches parameter name 'FolderServerRela
tiveUrl'.
I have a document library called docs and a folder F2, trying to delete everything within F2 folder.
this is the script:
$SiteURL = "https://test.sharepoint.com/sites/dev-ardian"
$ListName ="docs"
$FolderServerRelativeURL = "/sites/site/docs/F2"
Try {
#Connect to PnP Online
Connect-PnPOnline -URL $SiteURL -Credentials (Get-Credential)
#Get the web & folder
#Get All Items from Folder in Batch
$ListItems = Get-PnPListItem -List $ListName -FolderServerRelativeUrl $FolderServerRelativeURL -PageSize 2000 | Sort-Object ID -Descending
#Powershell to delete all files from folder
ForEach ($Item in $ListItems)
{
Remove-PnPListItem -List $ListName -Identity $Item.Id -Recycle -Force
Write-host "Removed File:"$Item.FieldValues.FileRef
}
}
Catch {
write-host "Error: $($_.Exception.Message)" -foregroundcolor Red
}
Might be a bit old to comment - I am testing the last script on this page (deleting a large folder with its files and sub-folders in batches). It did start and deleted my target folder but then continued on and started deleting other folders. Sounds like same issue Josh reported. Any thoughts?
ReplyDelete