当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] SharePoint Online:使用 PowerShell 删除空文件夹

作者:精品下载站 日期:2024-12-14 21:11:22 浏览:14 分类:玩电脑

SharePoint Online:使用 PowerShell 删除空文件夹


要求:使用 PowerShell 删除 SharePoint Online 文档库中的空文件夹。

[玩转系统] SharePoint Online:使用 PowerShell 删除空文件夹

您是否面临 SharePoint Online 网站中存在大量空文件夹的问题?而且,如果您像我一样,您可能想知道是否有更简单的方法来做到这一点。因为使用网络浏览器导航到每个文件夹来识别和删除它们会很麻烦。但 PowerShell 提供了一种快速、轻松地摆脱它们的方法。在这篇博文中,我们将了解如何使用 PowerShell 删除 SharePoint Online 中的空文件夹。

如何在 SharePoint Online 中查找空文件夹?

如果文件夹中没有任何文件或子文件夹,则该文件夹被视为空。因此,以下是我们如何使用项目子计数(文件夹根级别中的项目数,而不是所有项目的总数)从 Web 用户界面查找 SharePoint Online 中的空文件夹所有子文件夹中。)和文件夹子计数(文件夹根级别中的子文件夹数量)。

  1. 导航到文档库 >> 从“视图”下拉列表中单击“编辑当前视图”。
  2. 选择“文件夹子计数”和“项目子计数”列,然后单击“确定”。

    [玩转系统] SharePoint Online:使用 PowerShell 删除空文件夹

  3. 现在,该视图显示每个文件夹顶层的项目数和文件夹数。

    [玩转系统] SharePoint Online:使用 PowerShell 删除空文件夹

PowerShell 在 SharePoint Online 中查找空文件夹:

该脚本扫描给定文档库中的每个文件夹,并检查文件和子文件夹的数量是否等于“0”。


#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\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
}

此脚本列出了给定库的所有级别中的所有空文件夹。但是,当我们删除一个空文件夹时,它的父文件夹也会变空。 (前提是父文件夹只有一个空文件夹,并且其中没有其他文件!)。

SharePoint Online:用于删除空文件夹的 PowerShell

此 PowerShell 脚本从给定的 SharePoint Online 文档库中删除所有空文件夹。


#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\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 删除 SharePoint Online 中的空文件夹:

让我们使用 PnP PowerShell 进一步简化上述脚本:


#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

概括

总之,删除 SharePoint Online 中的空文件夹可能是一项耗时的任务,但通过使用 PowerShell,可以将其自动化。通过使用本文中提供的脚本,您可以快速轻松地删除 SharePoint Online 环境中的任何空文件夹,从而使您的网站保持井井有条并保持最新状态。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯