Поиск по сайту:

Удалить пустые папки в SharePoint Online


После объединения дублирующихся папок в SharePoint Online мне нужно было удалить пустые папки. Это также можно сделать с помощью PowerShell и PnP.

SharePoint url
$siteUrl = 'https://a-d.sharepoint.com/'

Site url
$site = 'sites/lab01'

Library name
$libraryName = 'Duplicates'

Set test mode
$whatIf = $true

Set force mode
Only set to true if you have fully tested it. Script WON'T ask for confirmation before deleting the file
$force = $false

#-----------------------------------------------------------[Functions]------------------------------------------------------------

#src https://www.sharepointdiary.com/2018/09/sharepoint-online-delete-empty-folders-using-powershell.html
Function Delete-PnPEmptyFolder([Microsoft.SharePoint.Client.Folder]$Folder)
{
    $FolderSiteRelativeURL = $Folder.ServerRelativeUrl.Substring($Web.ServerRelativeUrl.Length)

    # Process all Sub-Folders
    $SubFolders = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -ItemType Folder

    Foreach($SubFolder in $SubFolders)
    {
        # Exclude "Forms" and Hidden folders
        If(($SubFolder.Name -ne "Forms") -and (-Not($SubFolder.Name.StartsWith("_"))))
        {
            # Call the function recursively
            Delete-PnPEmptyFolder -Folder $SubFolder
        }
    }

    # Get all files & Reload Sub-folders from the given Folder
    $Files = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -ItemType File
    $SubFolders = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -ItemType Folder
 
    If ($Files.Count -eq 0 -and $SubFolders.Count -eq 0)
    {
		
		#Delete the folder
		$ParentFolder = Get-PnPProperty -ClientObject $Folder -Property ParentFolder
		$ParentFolderURL = $ParentFolder.ServerRelativeUrl.Substring($Web.ServerRelativeUrl.Length)    

		if ($whatIf -ne $true)
		{
			#Delete the folder
			Write-Host "Remove folder:" $Folder.Name "in" $ParentFolderURL -ForegroundColor Red
			Remove-PnPFolder -Name $Folder.Name -Folder $ParentFolderURL -force:$force -Recycle
		}
		else
		{
			Write-host $parentFolder
			Write-Host "Empty folder:" $Folder.Name "in" $ParentFolderURL -ForegroundColor Red
		}
    }
}

#-----------------------------------------------------------[Execution]------------------------------------------------------------

Login 
$url = $siteUrl + '/' + $site
Connect-PnPOnline -Url $url -UseWebLogin

Cleanup empty folders
$Web = Get-PnPWeb
$List = Get-PnPList -Identity $libraryName -Includes RootFolder

Delete-PnPEmptyFolder $List.RootFolder

Сценарий будет проходить через все папки рекурсивно. Если папка пустая, то она будет удалена. Если вы установите переменную WhatIf в значение true в начале сценария, он покажет только те папки, которые он удалит. Таким образом, вы сможете протестировать сценарий перед его фактическим выполнением.

Удалите папки на основе имени

Если вам нужно удалить папки только на основе их имени, например, папку, которая заканчивается на *(1), тогда вы можете изменить последнюю часть функции удаления на:

    If ($Files.Count -eq 0 -and $SubFolders.Count -eq 0)
    {
		if ($Folder.Name -like "*(1)") {
		
			#Delete the folder
			$ParentFolder = Get-PnPProperty -ClientObject $Folder -Property ParentFolder
			$ParentFolderURL = $ParentFolder.ServerRelativeUrl.Substring($Web.ServerRelativeUrl.Length)    

			if ($whatIf -ne $true)
			{
				#Delete the folder
				Write-Host "Remove folder:" $Folder.Name "in" $ParentFolderURL -ForegroundColor Red
				Remove-PnPFolder -Name $Folder.Name -Folder $ParentFolderURL -force:$force -Recycle
			}
			else
			{
				Write-host $parentFolder
				Write-Host "Empty folder:" $Folder.Name "in" $ParentFolderURL -ForegroundColor Red
			}
		}
    }

Вы можете найти оригинальную версию скрипта здесь на Sharepointdairy.com. Я сделал только несколько небольших изменений в скрипте. Вы также можете получить полный скрипт здесь на моем Github.