You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell统计SharePoint Online站点数据时遇集合未初始化错误求助

解决SharePoint Online站点统计脚本的「The collection has not been initialized」错误

问题根源

  1. Get-SPOWeb函数仅递归返回子站点,遗漏了根站点,导致统计不完整
  2. 使用SharePoint CSOM时,Web.Lists集合及列表的BaseType、ItemCount属性未被显式加载,直接访问会触发未初始化错误
  3. 变量名存在拼写错误(CountDocumentLibray应为CountDocumentLibrary)

修复后的完整脚本

# SharePoint站点URL
$SiteUrl = "https://yourtenant.sharepoint.com/sites/yoursite"

# 初始化统计变量
$Results = @()

# 获取连接凭据
$Cred = Get-Credential

Function Get-SPOWeb($WebURL){    
    # 创建凭据对象
    $Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)    
    
    # 初始化上下文
    $Context = New-Object Microsoft.SharePoint.Client.ClientContext($WebURL)    
    $Context.Credentials = $Credentials    
    $Web = $Context.Web    

    # 加载当前Web的标题、子站点,以及Lists集合的指定属性(必须显式声明需要的字段)
    $Context.Load($Web, 
        [Microsoft.SharePoint.Client.Web]::Properties["Title"],
        [Microsoft.SharePoint.Client.Web]::Properties["Webs"],
        [Microsoft.SharePoint.Client.Web]::Properties["Lists"]
    )
    # 加载Lists集合中每个列表的BaseType和ItemCount属性
    $Context.Load($Web.Lists, 
        [Microsoft.SharePoint.Client.ListCollection]::Include(
            [Microsoft.SharePoint.Client.List]::Properties["BaseType"],
            [Microsoft.SharePoint.Client.List]::Properties["ItemCount"]
        )
    )
    $Context.ExecuteQuery()    

    # 返回当前Web对象
    $Web

    # 递归处理所有子站点
    foreach ($Subweb in $Web.Webs) {        
        Get-SPOWeb -WebURL $Subweb.Url    
    }

    # 释放上下文资源
    $Context.Dispose()
}

# 获取所有站点(包括根站点和子站点)
$AllWebs = Get-SPOWeb -WebURL $SiteUrl

foreach ($web in $AllWebs) {    
    $CountDocumentLibrary = 0
    $CountDocumentItems = 0
    $CountList = 0
    $CountListItems = 0

    foreach($list in $web.Lists) {
        # 排除系统列表(可选,根据需求调整)
        if ($list.Hidden -eq $false) {
            if ($list.BaseType -eq [Microsoft.SharePoint.Client.BaseType]::DocumentLibrary) {          
                $CountDocumentLibrary++
                $CountDocumentItems += $list.ItemCount
            }
            else {
                $CountList++
                $CountListItems += $list.ItemCount
            }
        }
    }

    $Results += [PSCustomObject]@{
        '站点标题' = $web.Title 
        '文档库数量' = $CountDocumentLibrary
        '文档数量' = $CountDocumentItems
        '列表数量' = $CountList
        '列表项数量' = $CountListItems 
    }
}

# 输出统计结果
$Results | Select '站点标题', '文档库数量', '文档数量', '列表数量', '列表项数量' | Format-Table -AutoSize

关键修改说明

  • 函数返回逻辑:在递归子站点前先返回当前Web,确保根站点被纳入统计
  • 显式加载属性:使用Context.Load的重载方法,指定要加载的Web和列表属性,避免CSOM的延迟加载导致的未初始化错误
  • 变量名修正:修正了CountDocumentLibray的拼写错误
  • 资源释放:添加Context.Dispose()释放CSOM上下文资源
  • 系统列表排除:新增对隐藏系统列表的过滤,避免统计不需要的系统列表(可根据需求移除)

内容的提问来源于stack exchange,提问作者RachaelTheBlonde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:57:40