Generate all files not modified since 2 years in a SharePoint site

SR VSP 1,251 Reputation points
2023-07-31T16:37:23.4666667+00:00

Hi Guys,

I'm looking for a PS script to Generate all files which are not modified since 2 years for a specific SharePoint site

( Today - 2 years ). Any advise please ?

SharePoint
SharePoint
A group of Microsoft Products and technologies used for sharing and managing content, knowledge, and applications.
11,229 questions
SharePoint Development
SharePoint Development
SharePoint: A group of Microsoft Products and technologies used for sharing and managing content, knowledge, and applications.Development: The process of researching, productizing, and refining new or existing technologies.
3,577 questions
{count} votes

Accepted answer
  1. RaytheonXie_MSFT 40,446 Reputation points Microsoft External Staff
    2023-08-01T05:46:00.0533333+00:00

    Hi @SR VSP,

    Per my test, you can add a filter before export to the csv like following

    $filterDate = (Get-Date).AddDays(-730).Date
    if ($File.TimeLastModified -lt $filterDate){
    }
    

    Here is the complete code

    
    #Function to Generate Report on all documents in a SharePoint Online Site Collection
    Function Get-SPODocumentInventory($SiteURL)
    {
        Try {
            #Setup the context
            $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
            $Ctx.Credentials = $Credentials
        
            #Get the web from given URL and its subsites
            $Web = $Ctx.web
            $Ctx.Load($Web)
            $Ctx.Load($Web.Lists)
            $Ctx.Load($web.Webs)
            $Ctx.executeQuery()
      
            #Arry to Skip System Lists and Libraries
            $SystemLists =@("Converted Forms", "Master Page Gallery", "Customized Reports", "Form Templates", "List Template Gallery", "Theme Gallery",
                   "Reporting Templates", "Solution Gallery", "Style Library", "Web Part Gallery","Site Assets", "wfpub", "Site Pages", "Images")
          
            Write-host -f Yellow "Processing Site: $SiteURL"
      
            #Filter Document Libraries to Scan
            $Lists = $Web.Lists | Where {$_.BaseType -eq "DocumentLibrary" -and $_.Hidden -eq $false -and $SystemLists -notcontains $_.Title -and $_.ItemCount -gt 0}
            #Loop through each document library
            Foreach ($List in $Lists)
            {
                #Define CAML Query to Get List Items in batches
                $Query = New-Object Microsoft.SharePoint.Client.CamlQuery
                $Query.ViewXml ="
                    <View Scope='RecursiveAll'>
                       <Query>
                          <OrderBy><FieldRef Name='ID' Ascending='TRUE'/></OrderBy>
                       </Query>
                       <RowLimit Paged='TRUE'>$BatchSize</RowLimit>
                    </View>"
      
                Write-host -f Cyan "`t Processing Document Library: '$($List.Title)' with $($List.ItemCount) Item(s)"
      
                Do {
                    #Get List items
                    $ListItems = $List.GetItems($Query)
                    $Ctx.Load($ListItems)
                    $Ctx.ExecuteQuery()
     
                    #Filter Files
                    $Files = $ListItems | Where { $_.FileSystemObjectType -eq "File"}
     
                    #Iterate through each file and get data
                    $DocumentInventory = @()
                    Foreach($Item in $Files)
                    {
                        $File = $Item.File
                        $Ctx.Load($File)
                        $Ctx.ExecuteQuery()
    
                     
                        $filterDate = (Get-Date).AddDays(-730).Date
                        if ($File.TimeLastModified -lt $filterDate){
    
                            $DocumentData = New-Object PSObject
                            $DocumentData | Add-Member NoteProperty SiteURL($SiteURL)
                            $DocumentData | Add-Member NoteProperty DocLibraryName($List.Title)
                            $DocumentData | Add-Member NoteProperty FileName($File.Name)
                            $DocumentData | Add-Member NoteProperty FileURL($File.ServerRelativeUrl)
                            $DocumentData | Add-Member NoteProperty CreatedBy($Item["Author"].Email)
                            $DocumentData | Add-Member NoteProperty CreatedOn($File.TimeCreated)
                            $DocumentData | Add-Member NoteProperty ModifiedBy($Item["Editor"].Email)
                            $DocumentData | Add-Member NoteProperty LastModifiedOn($File.TimeLastModified)
                            $DocumentData | Add-Member NoteProperty Size-KB([math]::Round($File.Length/1KB))
    
                        }
      
                        
                            
                        #Add the result to an Array
                        $DocumentInventory += $DocumentData
                    }
                    #Export the result to CSV file
                    $DocumentInventory | Export-CSV $ReportOutput -NoTypeInformation -Append
                    $Query.ListItemCollectionPosition = $ListItems.ListItemCollectionPosition
                } While($Query.ListItemCollectionPosition -ne $null)
            }
               
            #Iterate through each subsite of the current web and call the function recursively
            ForEach ($Subweb in $Web.Webs)
            {
                #Call the function recursively to process all subsites underneaththe current web
                Get-SPODocumentInventory($Subweb.url)
            }
        }
        Catch {
            write-host -f Red "Error Generating Document Inventory!" $_.Exception.Message
        }
    }
      
    
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
    #Config Parameters
    $SiteCollURL="https://xxxx.sharepoint.com/sites/name"
    $ReportOutput="C:\xxx\DocInventory.csv"
    $BatchSize = 500
     
    #Set user name and password to connect
    $UserName="******@yyy.onmicrosoft.com"
    $Password = "pass"
     
    #Create Credential object from given user name and password
    $Cred = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName,(ConvertTo-SecureString $Password -AsPlainText -Force))
        
    #Set up the context
    $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteUrl)
    $Ctx.Credentials = $Cred
    
    
       
    #Delete the Output Report, if exists
    if (Test-Path $ReportOutput) { Remove-Item $ReportOutput }
       
    #Call the function
    Get-SPODocumentInventory $SiteCollURL
    
    
    
    

    If the answer is helpful, please click "Accept Answer" and kindly upvote it. If you have extra questions about this answer, please click "Comment".

    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.


0 additional answers

Sort by: Most helpful

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.