Weboldal keresés

SharePoint Online: Törölje az üres mappákat a PowerShell segítségével


Követelmény: Törölje az üres mappákat a SharePoint Online Dokumentumtárban a PowerShell segítségével.

Problémái vannak a SharePoint Online webhelyén található sok üres mappa miatt? És ha olyan vagy, mint én, valószínűleg azon töprengtél, hogy van-e egyszerűbb módja ennek. Mert ezek azonosítása és törlése a webböngészővel az egyes mappákba navigálással nehézkes lenne. A PowerShell azonban lehetőséget kínál arra, hogy gyorsan és egyszerűen megszabaduljon tőlük. Ebben a blogbejegyzésben megvizsgáljuk, hogyan törölhet üres mappákat a SharePoint Online-ban a PowerShell segítségével.

Hogyan kereshetek üres mappákat a SharePoint Online-ban?

Ha egy mappában nincs fájl vagy almappa, akkor üresnek tekintendő. Tehát a következőképpen találhatjuk meg az üres mappákat a SharePoint Online-ban a webes felhasználói felületről az Elemek száma használatával (az elemek száma a mappa gyökér szintjén, és NEM az összes elem száma az összes almappában.) és a Mappa gyermekszáma (A mappa gyökérszintjén lévő almappák száma).

  1. Keresse meg a dokumentumtárat >> Kattintson az „Aktuális nézet szerkesztése” elemre a Nézetek legördülő menüben.
  2. Válassza ki a „Mappa utódszáma” és az „Elemek száma” oszlopokat, majd kattintson az OK gombra.

  3. Most a nézet az egyes mappák legfelső szintjén az elemek számát és a mappák számát mutatja.

PowerShell az üres mappák megkereséséhez a SharePoint Online-ban:

Ez a szkript megvizsgálja az adott dokumentumkönyvtár minden mappáját, és ellenőrzi, hogy a fájlok és almappák száma „0”-e.


#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"
  
#Parameters
$SiteURL = "https://crescent.sharepoint.com/sites/marketing"
$ListName="Documents"
  
#Get Credentials to connect
$Cred= Get-Credential
   
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
  
#Get the List
$List = $Ctx.Web.lists.GetByTitle($ListName)
 
#Define the CAML Query to get folders
$Query = New-Object Microsoft.SharePoint.Client.CamlQuery
$Query.ViewXml = "@
<View Scope='RecursiveAll'>
    <Query>
        <Where>
            <And>
                <And>
                    <Eq><FieldRef Name='ContentType' /><Value Type='Text'>Folder</Value></Eq>
                    <Eq><FieldRef Name='ItemChildCount' /> <Value Type='Counter'>0</Value></Eq>
                </And>
                <Eq><FieldRef Name='FolderChildCount' /> <Value Type='Counter'>0</Value></Eq>                    
            </And>
        </Where>
    </Query>
</View>"
 
#Get All List Items matching the query
$Folders = $List.GetItems($Query)
$Ctx.Load($Folders)
$Ctx.ExecuteQuery()
 
Write-host "Total Number of Empty Folders:"$Folders.count
 
#Loop through each List Item
ForEach($Folder in $Folders)
{ 
    Write-host $Folder.FieldValues.FileRef
}

Ez a szkript felsorolja az összes üres mappát az adott könyvtár minden szintjén. Ha azonban törölünk egy üres mappát, a szülőmappája is üres lesz. (feltéve, hogy a szülőmappában csak egy üres mappa van, és nincs benne más fájl!).

SharePoint Online: PowerShell az üres mappák eltávolításához

Ez a PowerShell-szkript törli az összes üres mappát egy adott SharePoint Online dokumentumtárból.


#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 Delete-SPOEmptyFolders([Microsoft.SharePoint.Client.Folder]$Folder)
{
    #Get All Sub-Folders from the given Folder
    $SubFolders = $Folder.Folders
    $Ctx.Load($SubFolders)
    $Ctx.ExecuteQuery()

    #Process Each Sub-Folder Recursively
    ForEach($SubFolder in $SubFolders)
    {
        #Exclude "Forms" and Hidden folders
        If(($SubFolder.Name -ne "Forms") -and (-Not($SubFolder.Name.StartsWith("_"))) -and $SubFolder.Name -ne $RootFolder.Name)
        {
            #Call the function recursively
            Delete-SPOEmptyFolders $SubFolder
        }
    }

    #Get All Files and Sub-Folders from the Sub-folder
    $SubFolders = $Folder.Folders
    $Files = $Folder.Files
    $Ctx.Load($SubFolders)    
    $Ctx.Load($Files)
    $Ctx.ExecuteQuery()

    Write-host -f Yellow "Checking if the folder is Empty:" $Folder.serverRelativeURL
    #Delete Empty Folders
    If($SubFolders.Count -eq 0 -and $Files.Count -eq 0)
    {
        #Delete the folder
        $EmptyFolder=$Ctx.web.GetFolderByServerRelativeUrl($Folder.ServerRelativeUrl)
        $EmptyFolder.Recycle() | Out-Null
        $Ctx.ExecuteQuery()
        Write-host -f Green "`tDeleted Empty Folder:"$Folder.ServerRelativeUrl  
    }
}

#Set Variables
$SiteURL = "https://crescent.sharepoint.com/sites/marketing"
$LibraryName = "Migration Documents"

#Get Credentials to connect
$Cred = Get-Credential
 
Try {
    #Setup the context
    $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
    $Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.UserName,$Cred.Password)

    #Get the Root Folder of the Library
    $List = $Ctx.web.Lists.GetByTitle($LibraryName)
    $RootFolder = $List.RootFolder
    $Ctx.Load($RootFolder)
    $Ctx.ExecuteQuery() 

    #Call the function to delete empty folders from a document library
    Delete-SPOEmptyFolders $RootFolder
}
catch {
    write-host "Error: $($_.Exception.Message)" -foregroundcolor Red
}

PnP PowerShell az üres mappák törléséhez a SharePoint Online-ban:

Egyszerűsítsük tovább a fenti szkriptet a PnP PowerShell segítségével:


#Parameters
$SiteURL = "https://crescent.sharepoint.com/sites/Marketing"
$DocumentLibraryName = "Documents"
 
#Connect to the Site
Connect-PnPOnline -URL $SiteURL -Credentials (Get-Credential)

#Get the web & folder
$Web = Get-PnPWeb
$List = Get-PnPList -Identity $DocumentLibraryName -Includes RootFolder

Function Delete-PnPEmptyFolder([Microsoft.SharePoint.Client.Folder]$Folder)
{
    $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
            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+1)    
        Remove-PnPFolder -Name $Folder.Name -Folder $ParentFolderURL -Force -Recycle
        Write-Host -f Green ("Deleted Folder: '{0}' at '{1}'" -f $Folder.Name, $Folder.ServerRelativeURL)
    }

}
#Call the Function to Delete empty Folders
Delete-PnPEmptyFolder $List.RootFolder

Összegzés

Összefoglalva, az üres mappák törlése a SharePoint Online-ban időigényes feladat lehet, de a PowerShell használatával automatizálható. A cikkben található szkript használatával gyorsan és egyszerűen eltávolíthatja az üres mappákat a SharePoint Online környezetből, így webhelye rendszerezett és naprakész.

Kapcsolódó cikkek