SharePoint Online: PowerShell kullanarak Boş Klasörleri Silme


Gereksinim: PowerShell'i kullanarak SharePoint Çevrimiçi Belge Kitaplığındaki Boş Klasörleri silin.

SharePoint Online sitenizde çok sayıda boş klasör bulunmasıyla ilgili bir sorunla mı karşılaşıyorsunuz? Ve eğer siz de benim gibiyseniz muhtemelen bunu yapmanın daha kolay bir yolu olup olmadığını merak etmişsinizdir. Çünkü web tarayıcısını kullanarak her klasöre giderek bunları tanımlamak ve silmek zahmetli olacaktır. Ancak PowerShell bunlardan hızlı ve kolay bir şekilde kurtulmanın bir yolunu sunuyor. Bu blog yazımızda PowerShell kullanarak SharePoint Online'da boş klasörlerin nasıl silineceğine bir göz atacağız.

SharePoint Online'da Boş Klasörler Nasıl Bulunur?

Bir klasörün içinde herhangi bir dosya veya alt klasör yoksa boş kabul edilir. Öyleyse, SharePoint Online'da boş klasörleri web kullanıcı arayüzünden Öğe Alt Sayısı (Klasörün kök düzeyindeki öğe sayısı, tüm öğelerin toplamı DEĞİL) kullanarak nasıl bulabileceğimizi burada bulabilirsiniz. tüm alt klasörlerde.) ve Klasör Alt Sayısı (Klasörün kök düzeyindeki alt klasörlerin sayısı).

  1. Belge kitaplığına gidin >> Görünümler açılır menüsünden "Geçerli Görünümü Düzenle"ye tıklayın.
  2. “Klasör Çocuk Sayısı” ve “Öğe Çocuk Sayısı” sütunlarını seçin ve Tamam'a tıklayın.

  3. Artık görünüm, her klasörün üst düzeyindeki öğe sayısını ve klasör sayısını gösterir.

SharePoint Online'da Boş Klasörleri Bulmak için PowerShell:

Bu komut dosyası, verilen belge kitaplığındaki her klasörü tarar ve dosya ve alt klasör sayısının '0'a eşit olup olmadığını kontrol eder.


#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
}

Bu komut dosyası, verilen kitaplığın tüm seviyelerindeki tüm boş klasörleri listeler. Ancak boş bir klasörü sildiğimizde onun ana klasörü de boşalır. (ana klasörde yalnızca bir boş klasör olması ve içinde başka dosya olmaması koşuluyla!).

SharePoint Online: Boş Klasörleri Kaldırmak için PowerShell

Bu PowerShell betiği, belirli bir SharePoint Online belge kitaplığındaki tüm boş klasörleri siler.


#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
}

SharePoint Online'daki Boş Klasörleri Silmek için PnP PowerShell:

Yukarıdaki betiği PnP PowerShell ile daha da basitleştirelim:


#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

Özet

Sonuç olarak, SharePoint Online'da boş klasörleri silmek zaman alıcı bir görev olabilir ancak PowerShell kullanımıyla bu işlem otomatikleştirilebilir. Bu makalede sağlanan komut dosyasını kullanarak, SharePoint Online ortamınızdaki boş klasörleri hızlı ve kolay bir şekilde kaldırarak sitenizi düzenli ve güncel tutabilirsiniz.

İlgili makaleler