Delete custom SharePoint site designs
Remove Site designs and site scripts that ends up just hanging around in your tenant. Use the scripts below to get rid of them
Summary
Site designs and especially site scripts can be something that ends up just hanging around in your tenant for a long time even though you no longer need them for anything. Use the scripts below to get rid of them. You might also find some site scripts that are not linked to any site design and hence never get executed!
Connect-SPOService "https://contoso-admin.sharepoint.com"
$keepThese = "Register the new site", "Corporate Basic Site", "Corporate Internal Site"
$siteDesigns = Get-SPOSiteDesign
$siteDesigns = $siteDesigns | Where-Object { -not ($keepThese -contains $_.Title)}
if ($siteDesigns.Count -eq 0) { break }
$siteDesigns | Format-Table Title, SiteScriptIds, Description
Read-Host -Prompt "Press Enter to start deleting (CTRL + C to exit)"
$progress = 0
$total = $siteDesigns.Count
foreach ($siteDesign in $siteDesigns)
{
$progress++
Write-Host $progress / $total":" $siteDesign.Title
Remove-SPOSiteDesign $siteDesign.Id
}
$tenantAdminUrl = "https://contoso-admin.sharepoint.com"
Connect-PnPOnline -Url $tenantAdminUrl -Interactive
$SiteDesignTitlesToKeep = "Cat Lovers United", "Multicolored theme"
$sitedesigns = Get-PnPSiteDesign
$sitedesigns = $sitedesigns | where {-not ($sparksjoy -contains $_.Title)}
$sitedesigns | Format-Table Title, SiteScriptIds, Description
if ($sitedesigns.Count -eq 0) { break }
Read-Host -Prompt "Press Enter to start deleting (CTRL + C to exit)"
$progress = 0
$total = $sitedesigns.Count
foreach ($sitedesign in $sitedesigns)
{
$progress++
write-host $progress / $total":" $sitedesign.Title
Remove-PnPSiteDesign -Identity $sitedesign.Id -Force:$true
}
# Get Credentials to connect
$m365Status = m365 status
if ($m365Status -match "Logged Out") {
m365 login
}
$keepThese = "Register the new site", "Corporate Basic Site", "Corporate Internal Site"
# Get all site designs from the current tenant
$siteDesigns = m365 spo sitedesign list | ConvertFrom-Json
$siteDesigns = $siteDesigns | Where-Object { -not ($keepThese -contains $_.Title)}
if ($siteDesigns.Count -eq 0) { break }
$siteDesigns | Format-Table Title, SiteScriptIds, Description
Read-Host -Prompt "Press Enter to start deleting (CTRL + C to exit)"
$progress = 0
$total = $siteDesigns.Count
foreach ($siteDesign in $siteDesigns)
{
$progress++
Write-Host $progress / $total":" $siteDesign.Title
m365 spo sitedesign remove --id $siteDesign.Id
}
Contributors
| Author(s) |
|---|
| Paul Bullock |
| Leon Armston |
| Ganesh Sanap |
Disclaimer
THESE SAMPLES ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
Tool documentation & references
- Want to learn more about CLI for Microsoft 365 and the commands
Check out the CLI for Microsoft 365 site to get started and for the reference to the commands.
- Introduction to the SharePoint Online Management Shell
Check out the SPO Management Shell documentation site to get started and for the reference to the cmdlets.
- Want to learn more about PnP PowerShell and the cmdlets
Check out the PnP PowerShell site to get started and for the reference to the cmdlets.
- Delete custom SharePoint site designs
This sample first appeared on the CLI for Microsoft 365 documentation site