Sharepoint Online: Jak najít a smazat prázdné složky

Dnes přicházím s návodem, jak v Knihovně dokumentů, umístěné na na Sharepointu Online, získat seznam prádných složek a případně je ještě i smazat.

Dostal se ke mě požadavek od klienta, že po jejich interní akci, která souvisela s úklidem a přesouváním dat, objevili spousty prázdných složek a zda-li by bylo možné tyto složky automaticky najít a smazat.

No asi takhle, kdyby to nešlo, tak tento článek nevznikne.

Obsah

Připojení se ke knihovně dokumentů

Pro tuhle akci použijeme PnP PowerShell. Pokud nevíte, co to je a jak jej nainstalovat, doporučuji začít těmito odkazy:

Předpokládám tedy, že modul PnP Management Shell máte ve svém počítači nainstalovaný a že disponujete PowerShellem verze 7.

Nejprve tedy bude potřeba nadefinovat několik proměnných a připojit se k Sharepoint Site pomocí právě PnP.

#Parametry

# Adresa Sharepoint Online webu
$SiteURL = "https://vas_tenant.sharepoint.com/sites/vase_site"

# Nazev knihovny dokumentu
$DocumentLibraryName = "Documents"

# Pripojeni
Connect-PnPOnline -Url $SiteURL  -Interactive

# Nacteni webu a Root adresare do promennych
$Web = Get-PnPWeb
$List = Get-PnPList -Identity $DocumentLibraryName -Includes RootFolder

Pokud by se vyskytla chyba, že nelze načíst seznam do proměnné $List, vypište si všechny seznamy a knihovny pomocí příkazu Get-PnPList – bez parametrů

Get-PnPList

Problém s načtením knihovny bude souviset s tím, že název knihovny není document, ale „Sdílene dokumenty“, pak tedy změňte příkaz $DocumentLibraryName na

$DocumentLibraryName = "Sdilene dokumenty"

Nyní byste měli mít všechny prerekvizity potřebné k tomu, abyste mohli získávat informace z dokumentové knihovny.

Seznam prázdných složek

Níže vypsaná funkce vezme celou Sharepoint site a projde všechny adresáře od Rootu až do posledního zanoření s tím, že vynechá systémové složky (název Forms nebo začíná „_“). Skript projde všechny složky rekurzivně. Pokud je složka prázdná, zareportuje ji.

Skript všechny nálezy vypíše na obrazovku a zároveň uloží výstup do CSV „C:\Temp\EmptyFolterReport.csv„.

# Funkce inspirovana: https://www.sharepointdiary.com/2018/09/sharepoint-online-delete-empty-folders-using-powershell.html

Function Get-PnPEmptyFolder([Microsoft.SharePoint.Client.Folder]$Folder)
{
 
    $EmptyFolderArray = @()
    
    $FolderSiteRelativeURL = $Folder.ServerRelativeUrl.Substring($Web.ServerRelativeUrl.Length+1)
    
    #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
            Get-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+1)   

        Write-Host -f Green ("Empty Folder: '{0}' at '{1}'" -f $Folder.Name, $Folder.ServerRelativeURL)
        
        #Add the Data to Object
        $EmptyFolderData = New-Object PSObject
        $EmptyFolderData | Add-Member NoteProperty FolderName($Folder.Name)
        $EmptyFolderData | Add-Member NoteProperty RelativeURL($Folder.ServerRelativeURL)
        $EmptyFolderArray += $EmptyFolderData
    }

    #Export to CSV File
    $EmptyFolderArray | Export-CSV "C:\Temp\EmptyFolderReport.csv" -NoTypeInformation -Append
 
}

Smazání prázdných složek

Pokud jste provedli řádnou kontrolu pomocí předchozího skriptu, můžete přejít k samotnému smazání prázdných složek.

Níže vypsaná funkce vezme celou Sharepoint Site a projde všechny adresáře od Rootu až do posledního zanoření s tím, že vynechá systémové složky (název Forms nebo začíná „_“). Skript projde všechny složky rekurzivně. Pokud je složka prázdná, smaže ji!.

Skript všechny nálezy vypíše na obrazovku a zároveň uloží výstup do CSV „C:\Temp\DeletedFolderReport.csv„.

# Funkce inspirovana: https://www.sharepointdiary.com/2018/09/sharepoint-online-delete-empty-folders-using-powershell.html

Function Delete-PnPEmptyFolder([Microsoft.SharePoint.Client.Folder]$Folder)
{
 
    $EmptyFolderArray = @()
    
    $FolderSiteRelativeURL = $Folder.ServerRelativeUrl.Substring($Web.ServerRelativeUrl.Length+1)
    
    #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
            Get-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+1)   

        Remove-PnPFolder -Name $Folder.Name -Folder $ParentFolderURL -Force -Recycle

        Write-Host -f Green ("Empty Folder: '{0}' at '{1}'" -f $Folder.Name, $Folder.ServerRelativeURL)
        
        #Add the Data to Object
        $EmptyFolderData = New-Object PSObject
        $EmptyFolderData | Add-Member NoteProperty FolderName($Folder.Name)
        $EmptyFolderData | Add-Member NoteProperty RelativeURL($Folder.ServerRelativeURL)
        $EmptyFolderArray += $EmptyFolderData
    }

    #Export to CSV File
    $EmptyFolderArray | Export-CSV "C:\Temp\DeletedFolderReport.csv" -NoTypeInformation -Append
 
}

Tento skript by šel ještě vylepšit a to tak, že bychom přidali na začátek skriptu ještě „pojistku“ (proměnnou) která by provedla výmaz jen tehdy, pokud by byla proměnná nastavena na true/false.

# Testovaci rezim - pokud je true, neprovede vymaz ale jen vypis
$reportOnly = $true

Samotná funkce Delete-PnPEmptyFolder by se pak změnila takto:

# Funkce inspirovana: https://www.sharepointdiary.com/2018/09/sharepoint-online-delete-empty-folders-using-powershell.html

Function Delete-PnPEmptyFolder([Microsoft.SharePoint.Client.Folder]$Folder)
{
 
    $EmptyFolderArray = @()
    
    $FolderSiteRelativeURL = $Folder.ServerRelativeUrl.Substring($Web.ServerRelativeUrl.Length+1)
    
    #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
            Get-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+1)   

        # Remove-PnPFolder -Name $Folder.Name -Folder $ParentFolderURL -Force -Recycle
        # Write-Host -f Green ("Empty Folder: '{0}' at '{1}'" -f $Folder.Name, $Folder.ServerRelativeURL)
        
        if ($reportOnly -ne $true)
        {
          #Delete the folder
          Write-Host "Deleted folder:" $Folder.Name "in" $ParentFolderURL -ForegroundColor Red
          Remove-PnPFolder -Name $Folder.Name -Folder $ParentFolderURL -Force -Recycle
        }
        else
        {
          Write-host $parentFolder
          Write-Host "Empty folder:" $Folder.Name "in" $ParentFolderURL -ForegroundColor Green
        }

        
        
        #Add the Data to Object
        $EmptyFolderData = New-Object PSObject
        $EmptyFolderData | Add-Member NoteProperty FolderName($Folder.Name)
        $EmptyFolderData | Add-Member NoteProperty RelativeURL($Folder.ServerRelativeURL)
        $EmptyFolderArray += $EmptyFolderData
    }

    #Export to CSV File
    $EmptyFolderArray | Export-CSV "C:\Temp\DeletedFolderReport.csv" -NoTypeInformation -Append
 
}

Volání funkcí

Výše uvedené funkce by se pak volaly jednoduše pomocí těchto příkazů:

# Spusteni reportu - vypis prazdnych slozek
Get-PnPEmptyFolder $List.RootFolder

# Spusteni reportu - smazani prazdnych slozek
Delete-PnPEmptyFolder $List.RootFolder

Napsat komentář