SharePoint Online: Delete Attachments from List Item using PowerShell

Requirement: Delete Attachment from SharePoint Online List Item.

How to Delete Attachments from List Items in SharePoint Online?

Are you looking for a way to delete attachments from list items? This blog post will show you how to remove an attachment from a SharePoint list item. We’ll also share the PowerShell scripts to delete attachments from SharePoint Online list items.

To delete an attachment from SharePoint list items, do the following:

  1. Navigate to the SharePoint Online List >> Select the List Item >> Click on Edit from tool pane.
  2. In the Edit panel, scroll down to the bottom and click on the little X Icon next to any attachment to delete it from the list item.
    sharepoint online delete attachment from list item powershell
  3. Click on Save to commit your changes.

The attachment will now be removed from the SharePoint Online list item. You can also remove attachments using PowerShell to automate the process for multiple list items.

Delete All Attachments from a List Item using PowerShell

Let’s delete all attachments from a SharePoint Online list item using PowerShell.

#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"

#Set Parameters
$SiteURL= "https://crescent.sharepoint.com"
$ListName="Projects"
$ItemID="4"

Try {
    #Setup Credentials to connect
    $Cred = Get-Credential
    $Cred = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.UserName,$Cred.Password)
     
    #Setup the context
    $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
    $Ctx.Credentials = $Cred
 
    #Get the List & List Item
    $List = $Ctx.Web.Lists.GetByTitle($ListName)
    $Ctx.Load($List)
    $ListItem = $List.GetItemByID($ItemID)
    $Ctx.Load($ListItem)
    $Ctx.ExecuteQuery()
 
    #Get All existing attachments
    $AttachmentFiles = $ListItem.AttachmentFiles
    $Ctx.Load($AttachmentFiles)
    $Ctx.ExecuteQuery()
 
    ForEach($AttachmentFile in $AttachmentFiles)
    {
        $AttachmentFile.DeleteObject()
        $Ctx.ExecuteQuery()
 
        write-host  -f Green "Attachment File '$AttachmentFile' Removed from List Item!"
    }
}
Catch {
    write-host -f Red "Error Removing Attachment From List!" $_.Exception.Message
}

PowerShell to Remove Attachment from SharePoint Online List Item:

Let’s wrap the script inside a reusable function to delete a specific attachment from a given list item:

#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 Remove-AttachmentFromListItem()
{
    param
    (
        [Parameter(Mandatory=$true)] [string] $SiteURL,
        [Parameter(Mandatory=$true)] [string] $ListName,
        [Parameter(Mandatory=$true)] [string] $ItemID,
        [Parameter(Mandatory=$false)] [string] $AttachmentFileName
    )    
    Try {
        #Setup Credentials to connect
        $Cred = Get-Credential
        $Cred = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.UserName,$Cred.Password)
    
        #Setup the context
        $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
        $Ctx.Credentials = $Cred

        #Get the List & List Item
        $List = $Ctx.Web.Lists.GetByTitle($ListName)
        $Ctx.Load($List)
        $ListItem = $List.GetItemByID($ItemID)
        $Ctx.Load($ListItem)
        $Ctx.ExecuteQuery()

        #Get All existing attachments
        $AttachmentFiles = $ListItem.AttachmentFiles
        $Ctx.Load($AttachmentFiles)
        $Ctx.ExecuteQuery()

        #Check if attachment file name exists
        $AttachmentFile = $AttachmentFiles | where { ($_.FileName -eq $AttachmentFileName) }
        If($AttachmentFile -ne $Null)
        {
            $AttachmentFile.DeleteObject()
            $Ctx.ExecuteQuery()

            write-host  -f Green "Attachment File '$AttachmentFileName' Removed from List Item!" 
        }
        else
        {
            write-host -f Yellow "Attachment File '$AttachmentFileName' Doesn't Exist!"
        }
    }
    Catch {
        write-host -f Red "Error Removing Attachment From List!" $_.Exception.Message
    }
}

#Set Parameters
$SiteURL= "https://crescent.sharepoint.com"
$ListName="Projects"
$ItemID="64"
$AttachmentFileName="ProjectProposal.docx"

#Call the function to copy list items
Remove-AttachmentFromListItem -SiteURL $SiteURL -ListName $ListName -ItemID $ItemID -AttachmentFileName $AttachmentFileName

PnP PowerShell to Delete Attachment from SharePoint Online List Item

Here is the PnP PowerShell way of removing a list item attachment:

#Config Variables
$SiteURL = "https://Crescent.sharepoint.com"
$ListName ="Projects"
$ListItemTitle = "SharePoint 2016 Upgrade"
$AttachmentFileName= "Project Proposal.docx"

#Connect PnP Online
Connect-PnPOnline -Url $SiteURL -Credentials (Get-Credential)

#Get the Context
$Context = Get-PnPContext
 
#Get the List Item from "Title" field value
$Query = "<View><Query><Where><Eq><FieldRef Name='Title'/><Value Type='Text'>$ListItemTitle</Value></Eq></Where></Query></View>"
$ListItem = Get-PnPListItem -List $ListName -Query $Query -PageSize 1
 
#Get List attachment by its file name
$Attachment = $ListItem.AttachmentFiles.GetByFileName($AttachmentFileName)

#Delete the attachment
$Attachment.DeleteObject() 
$Context.ExecuteQuery()

You can also use the PnP PowerShell cmdlet Remove-PnPListItemAttachment

#Parameters
$SiteURL = "https://crescent.sharepoint.com/sites/Retail"
$ListName = "Projects"
$ListItemID = 13
$AttachmentFile = "MonthlyRpt.csv"

#Connect to SharePoint Online Site
Connect-PnPOnline -Url $SiteURL -Interactive

#Remove Attachment file from a list item
Remove-PnPListItemAttachment -List $ListName -Identity $ListItemID -FileName $AttachmentFile -Force -Recycle

Salaudeen Rajack

Salaudeen Rajack - SharePoint Expert with Two decades of SharePoint Experience. Love to Share my knowledge and experience with the SharePoint community, through real-time articles!

Leave a Reply

Your email address will not be published. Required fields are marked *