1. Introduction
In SharePoint Online, enforcing content expiration policies ensures that documents and records are retired, archived, or deleted when they are no longer needed. This helps:
✔ Reduce storage costs
✔ Improve data governance and compliance
✔ Prevent clutter from outdated content
✔ Ensure sensitive data is not retained unnecessarily
PnP PowerShell allows administrators to automate content lifecycle management by applying expiration rules, moving expired content, and deleting obsolete files.
2. Prerequisites
Before enforcing content expiration policies, ensure:
✅ PnP PowerShell is installed
Install-Module -Name PnP.PowerShell -Scope CurrentUser -Force
You have SharePoint Administrator or Global Administrator permissions
Retention or expiration policies are configured in Microsoft Purview Compliance Center
Content types and metadata fields like Expiration Date are defined in document libraries
3. Understanding Content Expiration Policies in SharePoint
Expiration policies in SharePoint allow organizations to automatically:
✔ Move content to an archive
✔ Delete outdated documents
✔ Trigger workflows when content reaches its expiration date
These policies are typically based on:
✔ Created Date (e.g., delete after 2 years)
✔ Modified Date (e.g., archive after 1 year of inactivity)
✔ Custom Metadata (e.g., Expiration Date field set by users)
4. Connecting to SharePoint Online Using PnP PowerShell
To interact with SharePoint Online, first connect to your tenant:
Connect-PnPOnline -Url "https://yourtenant-admin.sharepoint.com" -Interactive
✔ This prompts an authentication window to log in securely.
5. Creating and Applying Retention Policies
You can set retention policies in Microsoft 365 Compliance Center, but you can also use PnP PowerShell to enforce expiration policies dynamically.
A. Adding an Expiration Date Column to a Library
To track document expiration, create a custom column:
Add-PnPField -List "Documents" -DisplayName "Expiration Date" -InternalName "ExpirationDate" -Type DateTime
Write-Host "Expiration Date column added successfully."
✔ This creates a column where users can manually set an expiration date.
B. Applying a Default Expiration Date
To automatically set the Expiration Date when a file is created:
Set-PnPListItem -List "Documents" -Identity 1 -Values @{"ExpirationDate" = (Get-Date).AddYears(2)}
✔ This ensures documents expire in 2 years.
6. Automating Content Expiration Using PnP PowerShell
You can automate content expiration policies by checking document dates and moving or deleting expired content.
A. Identifying Expired Documents
$Today = Get-Date
$ExpiredDocs = Get-PnPListItem -List "Documents" | Where-Object { $_["ExpirationDate"] -lt $Today }
$ExpiredDocs | ForEach-Object {
Write-Host "Expired Document Found: $($_.FieldValues.Title) - Expired on $($_.FieldValues.ExpirationDate)"
}
✔ This script identifies documents past their expiration date.
B. Moving Expired Documents to an Archive
To move expired documents to an “Archived” folder:
$ExpiredDocs | ForEach-Object {
Move-PnPFile -ServerRelativeUrl $_["FileRef"] -TargetUrl "/sites/YourSite/Shared Documents/Archived"
Write-Host "Moved expired document: $($_.FieldValues.Title)"
}
✔ Prevents accidental deletion by archiving instead.
C. Automatically Deleting Expired Documents
If the policy requires deletion:
$ExpiredDocs | ForEach-Object {
Remove-PnPListItem -List "Documents" -Identity $_.Id -Force
Write-Host "Deleted expired document: $($_.FieldValues.Title)"
}
✔ Deletes expired files permanently.
7. Monitoring and Managing Expired Content
To keep track of expired files, export logs to a CSV report:
$ExpiredDocs | Select-Object FieldValues.Title, FieldValues.ExpirationDate | Export-Csv -Path "C:\Reports\ExpiredDocuments.csv" -NoTypeInformation
Write-Host "Expired content report generated successfully!"
✔ Helps maintain audit logs of deleted or archived content.
Automating Expiration Checks with Task Scheduler
To automate expiration checks daily:
1️⃣ Save your script as C:\Scripts\CheckExpiredDocuments.ps1
2️⃣ Open Task Scheduler
3️⃣ Click Create Basic Task
4️⃣ Set Trigger to Daily at 12:00 AM
5️⃣ Set Action to Start a Program
6️⃣ Enter powershell.exe
in Program/Script
7️⃣ In Add Arguments, enter:
-File "C:\Scripts\CheckExpiredDocuments.ps1"
8️⃣ Click Finish to enable automation
✔ This automatically enforces content expiration policies daily.