Delete all the previous year files from the Site collection using PowerShell
Sometimes it is possible that, when you are working with millions of files in your SharePoint site’s and you just don’t require the previous year files stored inside various document libraries and want to remove all the files from document libraries, then it is very time-consuming process when it comes to delete millions of files manually from different document libraries of the site collection.
In this article, we
will focus on how to remove all the previous year files present in any document
library in the site collection using PowerShell. It is possible that PowerShell
may take time to complete the execution of the script if the site contains
large number of files inside its document libraries.
We need to follow the below steps to create the script for the deletion of the previous year files.
1. First, we need to add the “dll” files in our GAC folder and add the path in our script.
| 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"  | 
        2.      
Now, you
need to connect to the site from where you want to delete the documents. 
| #Change the site url $siteurl=https://contoso.sharepoint.com/sites/TestSite/ 
 #Get Credentials to
  connect $Cred = Get-Credential 
 #Connect to PnP Online Connect-PnPOnline -URL $SiteURL -Interactive 
 #Get sites in
  SharePoint Online using PnP PowerShell $Webs = Get-PnPWeb  | 
| # Function for
  fetching files based on document library or folder name Function GetFiles($Path){     try{         #Get all files using document library url          $Files = Get-PnPFolderItem -FolderSiteRelativeUrl $Path -ItemType File         Foreach ($File in $Files)         {             #Remove file if the document is updated on
  or before 2021              If($File.TimeLastModified.Year -ne 2022){ 
                 #Uncomment the below line to remove all the
  prevoius year documents                 Remove-PnPFile -ServerRelativeUrl $File.ServerRelativeURL -Force -Recycle                       Write-Host -f Red ("Deleted File: '{0}' at '{1}'" -f 
  $File.TimeLastModified.Year, $File.ServerRelativeURL)                   }else{                       Write-Host -f Green ("Present File: '{0}' at '{1}'" -f 
  $File.TimeLastModified.Year, $File.ServerRelativeURL)                   }         }  
       }     catch {         write-host "Error: $($_.Exception.Message)" -foregroundcolor Red     }   }
   | 
| #Function for getting
  folder and subfolders Function GetFolders($folderUrl)   {           try{         $folderColl=Get-PnPFolderItem -FolderSiteRelativeUrl $folderUrl -ItemType Folder            # Loop through the folders           foreach($folder in $folderColl)           {                                   $newFolderURL= $folderUrl+"/"+$folder.Name 
               If($folder.Name -ne "Forms" -and (-Not($folder.Name.StartsWith("_")))){                  GetFiles($newFolderURL);                 GetFolders($newFolderURL)                   $libraryName = $folderUrl.Split("/")[1]                               #Remove empty folder                 if ($folder.ItemCount -eq 0 -and (($folder.Name -notmatch 'Document') -and ($folder.Name -notmatch $libraryName)))                   {                       $ParentFolder = Get-PnPProperty -ClientObject $folder -Property ParentFolder                     $ParentFolderURL = 
  $ParentFolder.ServerRelativeUrl.Substring($Webs.ServerRelativeUrl.Length)                        $ParentFolderURL $ParentFolderURL.Substring(1,($ParentFolderURL.Length-1))                     Remove-PnPFolder -Name $folder.Name -Folder $ParentFolderURL -Force                      Write-Host -f Green ("Deleted Folder: '{0}' at '{1}'" -f $folder.Name, $folder.ServerRelativeURL)                 }                }         } 
       }     catch {         write-host "Error: $($_.Exception.Message)" -foregroundcolor Red     }        
   }   | 
| *Note: This
  function will not consider the folders with name “Forms” and other folders
  whose name starts with “_”. Also, this function will remove all the empty
  folders as well. | 
5. Add the below function to iterate through every sites and subsites and get all the document libraries (The Document libraries which are not having “BaseTemplate” 101 and are hidden will not be considered here).
Here the document libraries with name “Site Assets”, “Style Library” and “personalefiler” will not be considered here, as it contains some important files which needs to be preserved for the site.
If you have any important document library whose files needs to be preserved and then you can add the condition along with the conditions which are already added for the “Site Assets”, “Style Library” and “personalefiler” document libraries.
| Try { 
     #Iterate through each site     ForEach($Web in $Webs)     {         #Get all document libraries - Exclude
  Hidden Libraries         $DocumentLibraries = Get-PnPList | Where-Object {$_.BaseTemplate -eq 101 -and $_.Hidden -eq $false}                  #Iterate through each site         ForEach($doc in $DocumentLibraries)         {              #Apply condition to avoid the deletion of
  document libraries              If($doc.Title -ne "Site Assets" -and $doc.Title -ne "Style Library" -and $doc.Title -ne "personalefiler"){                 $Library = Get-PnPList -Identity $doc.Title -Includes RootFolder                 $RootFolder = $Library.RootFolder 
                  #Get the site relative path of the Folder                 If($RootFolder.Context.web.ServerRelativeURL -eq "/")                 {                     $FolderSiteRelativeURL = $RootFolder.ServerRelativeUrl                 }                 Else                 {                            $FolderSiteRelativeURL = $RootFolder.ServerRelativeUrl.Replace($RootFolder.Context.web.ServerRelativeURL,[string]::Empty)                 }  
                 GetFiles($FolderSiteRelativeURL);                   GetFolders($FolderSiteRelativeURL);             }         } 
         #Get subsites in SharePoint Online using
  PnP PowerShell         $WebsCollection = Get-PnPSubWeb -Recurse 
         #Iterate through each subsite         ForEach($Subsite in $WebsCollection)         {             #Get Document Libraries Name, Default URL
  and Number of Items             Write-host "Subsite" $Subsite.Url 
            
  $FinalSubsiteurl = $Subsite.Url             Connect-PnPOnline -Url $FinalSubsiteurl -Interactive 
             #Get all document libraries - Exclude
  Hidden Libraries             $DocumentLibrariesSubsites = Get-PnPList | Where-Object {$_.BaseTemplate -eq 101 -and $_.Hidden -eq $false}                       ForEach($subdoc in $DocumentLibrariesSubsites)              {                #Apply condition to avoid the deletion of
  document libraries               If($subdoc.Title -ne "Site Assets" -and $subdoc.Title -ne "Style Library" -and $subdoc.Title -ne "personalefiler"){                     $SubsiteLibrary = Get-PnPList -Identity $subdoc.Title -Includes RootFolder                     $SubsiteRootFolder = $SubsiteLibrary.RootFolder 
                     #Get the site relative path of the Folder                     If($SubsiteRootFolder.Context.web.ServerRelativeURL -eq "/" -or [string]::IsNullOrEmpty($SubsiteRootFolder.Context.web.ServerRelativeURL))                     {                         $SubsiteFolderSiteRelativeURL = $SubsiteRootFolder.ServerRelativeUrl                     }                     Else                     {                                $SubsiteFolderSiteRelativeURL = $SubsiteRootFolder.ServerRelativeUrl.Replace($SubsiteRootFolder.Context.web.ServerRelativeURL,[string]::Empty)                     }                                     GetFiles($SubsiteFolderSiteRelativeURL);                     GetFolders($SubsiteFolderSiteRelativeURL);                }             }         }     } } catch {     write-host "Error: $($_.Exception.Message)" -foregroundcolor Red }  | 
    Below
is the full script which you can execute in the PowerShell command after updating
the “Site Collection Name”.
| 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" 
 #Change the site url $siteurl="https://contoso.sharepoint.com/sites/TestSite/" #Get Credentials to connect $Cred = Get-Credential 
 #Connect to PnP Online Connect-PnPOnline -URL $SiteURL -Interactive 
 #Get sites in SharePoint Online using PnP
  PowerShell $Webs = Get-PnPWeb 
 #function for getting folder and subfolders Function GetFolders($folderUrl)   {           try{         $folderColl=Get-PnPFolderItem -FolderSiteRelativeUrl $folderUrl -ItemType Folder            # Loop through the folders           foreach($folder in $folderColl)           {                                   $newFolderURL= $folderUrl+"/"+$folder.Name 
               If($folder.Name -ne "Forms" -and (-Not($folder.Name.StartsWith("_")))){                  GetFiles($newFolderURL);                 GetFolders($newFolderURL)                   $libraryName = $folderUrl.Split("/")[1]                               #Remove empty folder                 if ($folder.ItemCount -eq 0 -and (($folder.Name -notmatch 'Document') -and ($folder.Name -notmatch $libraryName)))                   {                       $ParentFolder = Get-PnPProperty -ClientObject $folder -Property ParentFolder                     $ParentFolderURL = 
  $ParentFolder.ServerRelativeUrl.Substring($Webs.ServerRelativeUrl.Length)                        $ParentFolderURL = $ParentFolderURL.Substring(1,($ParentFolderURL.Length-1))                     Remove-PnPFolder -Name $folder.Name -Folder $ParentFolderURL -Force                      Write-Host -f Green ("Deleted Folder: '{0}' at '{1}'" -f $folder.Name, $folder.ServerRelativeURL)                 }                }         } 
       }     catch {         write-host "Error: $($_.Exception.Message)" -foregroundcolor Red     }        
   }  
 # function for fetching files based on
  document library or folder name Function GetFiles($Path){     try{         #Get all files using document library url          $Files = Get-PnPFolderItem -FolderSiteRelativeUrl $Path -ItemType File         Foreach ($File in $Files)         {             #Remove file if the document is updated on
  or before 2021              If($File.TimeLastModified.Year -ne 2022){ 
                 #Uncomment the below line to remove all the
  prevoius year documents                 Remove-PnPFile -ServerRelativeUrl $File.ServerRelativeURL -Force -Recycle                       Write-Host -f Red ("Deleted File: '{0}' at '{1}'" -f 
  $File.TimeLastModified.Year, $File.ServerRelativeURL)                   }else{                       Write-Host -f Green ("Present File: '{0}' at '{1}'" -f 
  $File.TimeLastModified.Year, $File.ServerRelativeURL)                   }         }  
       }     catch {         write-host "Error: $($_.Exception.Message)" -foregroundcolor Red     }   }   Try { 
     #Iterate through each site     ForEach($Web in $Webs)     {         #Get all document libraries - Exclude
  Hidden Libraries         $DocumentLibraries = Get-PnPList | Where-Object {$_.BaseTemplate -eq 101 -and $_.Hidden -eq $false}                  #Iterate through each site         ForEach($doc in $DocumentLibraries)         {              #Apply condition to avoid the deletion of
  document libraries              If($doc.Title -ne "Site Assets" -and $doc.Title -ne "Style Library" -and $doc.Title -ne "personalefiler"){                 $Library = Get-PnPList -Identity $doc.Title -Includes RootFolder                 $RootFolder = $Library.RootFolder 
                  #Get the site relative path of the Folder                 If($RootFolder.Context.web.ServerRelativeURL -eq "/")                 {                     $FolderSiteRelativeURL = $RootFolder.ServerRelativeUrl                 }                 Else                 {                            $FolderSiteRelativeURL = $RootFolder.ServerRelativeUrl.Replace($RootFolder.Context.web.ServerRelativeURL,[string]::Empty)                 }  
                 GetFiles($FolderSiteRelativeURL);                   GetFolders($FolderSiteRelativeURL);             }         } 
         #Get subsites in SharePoint Online using
  PnP PowerShell         $WebsCollection = Get-PnPSubWeb -Recurse 
         #Iterate through each subsite         ForEach($Subsite in $WebsCollection)         {             #Get Document Libraries Name, Default URL
  and Number of Items             Write-host "Subsite" $Subsite.Url 
             $FinalSubsiteurl = $Subsite.Url             Connect-PnPOnline -Url $FinalSubsiteurl -Interactive 
             #Get all document libraries - Exclude
  Hidden Libraries             $DocumentLibrariesSubsites = Get-PnPList | Where-Object {$_.BaseTemplate -eq 101 -and $_.Hidden -eq $false}                       ForEach($subdoc in $DocumentLibrariesSubsites)              {                #Apply condition to avoid the deletion of
  document libraries               If($subdoc.Title -ne "Site Assets" -and $subdoc.Title -ne "Style Library" -and $subdoc.Title -ne "personalefiler"){                     $SubsiteLibrary = Get-PnPList -Identity $subdoc.Title -Includes RootFolder                     $SubsiteRootFolder = $SubsiteLibrary.RootFolder 
                     #Get the site relative path of the Folder                     If($SubsiteRootFolder.Context.web.ServerRelativeURL -eq "/" -or [string]::IsNullOrEmpty($SubsiteRootFolder.Context.web.ServerRelativeURL))                     {                         $SubsiteFolderSiteRelativeURL = $SubsiteRootFolder.ServerRelativeUrl                     }                     Else                     {                                $SubsiteFolderSiteRelativeURL = $SubsiteRootFolder.ServerRelativeUrl.Replace($SubsiteRootFolder.Context.web.ServerRelativeURL,[string]::Empty)                     }                                     GetFiles($SubsiteFolderSiteRelativeURL);                     GetFolders($SubsiteFolderSiteRelativeURL);                }             }         }     } } catch {     write-host "Error: $($_.Exception.Message)" -foregroundcolor Red } | 

 
Comments
Post a Comment