PowerShell统计SharePoint Online站点数据时遇集合未初始化错误求助
问题根源
Get-SPOWeb函数仅递归返回子站点,遗漏了根站点,导致统计不完整- 使用SharePoint CSOM时,
Web.Lists集合及列表的BaseType、ItemCount属性未被显式加载,直接访问会触发未初始化错误 - 变量名存在拼写错误(
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
相关产品推荐
相关产品推荐

