如何使用PowerShell按指定日期范围统计OneDrive文件及文件夹数量
筛选指定日期范围的OneDrive文件/文件夹统计方案
要统计2011年3月3日至2022年8月31日之间创建的文件和文件夹,推荐在服务器端通过CAML查询过滤数据,减少本地处理压力,比客户端过滤更高效。以下是修改后的完整脚本:
$SiteURL = "" $ListName = "Documents" Connect-PnPOnline $SiteURL -Credentials $credential # 定义目标日期范围 $startDate = [DateTime]"2011-03-03" $endDate = [DateTime]"2022-08-31" # 构建CAML查询,在服务器端筛选符合日期条件的项目 $camlQuery = @" <View> <Query> <Where> <And> <Geq> <FieldRef Name='Created' /> <Value Type='DateTime' IncludeTimeValue='FALSE'>$($startDate.ToString('yyyy-MM-dd'))</Value> </Geq> <Leq> <FieldRef Name='Created' /> <Value Type='DateTime' IncludeTimeValue='FALSE'>$($endDate.ToString('yyyy-MM-dd'))</Value> </Leq> </And> </Where> </Query> <ViewFields> <FieldRef Name='FileLeafRef' /> <FieldRef Name='Created' /> <FieldRef Name='Modified' /> <FieldRef Name='SMTotalFileStreamSize' /> <FieldRef Name='FileRef' /> <FieldRef Name='File_x0020_Type' /> </ViewFields> <RowLimit>500</RowLimit> </View> "@ $global:counter = 0 # 获取符合条件的文件夹 $FolderItems = Get-PnPListItem -List $ListName -CamlQuery $camlQuery -ScriptBlock { Param($items) $global:counter += $items.Count; Write-Progress -PercentComplete ($global:Counter / ($List.ItemCount) * 100) -Activity "获取列表项目:" -Status "已处理 $global:Counter / $($List.ItemCount) 个项目" } | Where { $_.FileSystemObjectType -eq "folder" } # 获取符合条件的文件 $FileItems = Get-PnPListItem -List $ListName -CamlQuery $camlQuery -ScriptBlock { Param($items) $global:counter += $items.Count; Write-Progress -PercentComplete ($global:Counter / ($List.ItemCount) * 100) -Activity "获取列表项目:" -Status "已处理 $global:Counter / $($List.ItemCount) 个项目" } | Where { $_.FileSystemObjectType -eq "File" } # 输出统计结果 Write-Host "符合日期范围的文件夹总数: $($FolderItems.Count)" Write-Host "符合日期范围的文件总数: $($FileItems.Count)" Write-Host "符合日期范围的项目总数: $($FolderItems.Count + $FileItems.Count)"
关键说明
- CAML查询优势:直接在SharePoint服务器端过滤数据,只返回符合日期条件的项目,避免拉取全量数据,大幅提升大列表场景下的运行效率。
- 日期格式要求:SharePoint对DateTime类型的查询值要求使用
yyyy-MM-dd格式,IncludeTimeValue='FALSE'表示忽略时间部分,匹配日期当天的所有项目。 - 文件/文件夹区分:通过
FileSystemObjectType属性分别过滤,实现文件和文件夹的单独统计。
备选方案(客户端过滤)
如果列表项目量较小,也可以直接在原有脚本的Where语句中添加日期条件,无需修改CAML:
$FolderItems = Get-PnPListItem -List $ListName -PageSize 500 -Fields "FileLeafRef", "Created","Modified", "SMTotalFileStreamSize","FileRef","File_x0020_Type" -ScriptBlock { Param($items) $global:counter += $items.Count; Write-Progress -PercentComplete ($global:Counter / ($List.ItemCount) * 100) -Activity "获取列表项目:" -Status "已处理 $global:Counter / $($List.ItemCount) 个项目" } | Where { $_.FileSystemObjectType -eq "folder" -and $_.Created -ge [DateTime]"2011-03-03" -and $_.Created -le [DateTime]"2022-08-31" }
注意:大列表场景下不推荐客户端过滤,会导致脚本运行缓慢。
内容的提问来源于stack exchange,提问作者aasenomad
相关产品推荐
相关产品推荐

