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