求助:使用PowerShell获取SharePoint站点文档文件夹失败,仅得.dll文件
问题根源
你当前脚本里的Get-ChildItem是Windows本地文件系统命令,和SharePoint Online完全无关,所以它只会返回当前PowerShell工作目录下的本地文件(也就是你看到的.dll文件),根本不会访问SharePoint站点内容。
修正后的解决方案
要获取SharePoint站点里的文档和文件夹,需要使用SharePoint Online专属的PowerShell命令,以下是基于官方Microsoft.Online.SharePoint.PowerShell模块的实现:
步骤1:确保模块已安装
如果还没安装,先执行:
Install-Module -Name Microsoft.Online.SharePoint.PowerShell -Force -AllowClobber
步骤2:完整脚本示例
# 连接SharePoint管理员中心 Connect-SPOService -url https://mycompany-admin.sharepoint.us # 获取所有站点(加上-Limit All确保返回全部,默认仅返回200个) $sites = Get-SPOSite -Limit All foreach ($site in $sites) { Write-Host "===== 正在处理站点: $($site.Url) =====" -ForegroundColor Cyan # 筛选当前站点内的非隐藏文档库(排除系统默认的隐藏库) $documentLibraries = Get-SPOList -Site $site.Url | Where-Object { $_.BaseType -eq "DocumentLibrary" -and $_.Hidden -eq $false } foreach ($lib in $documentLibraries) { Write-Host "--- 处理文档库: $($lib.Title) ---" -ForegroundColor Green # 获取文档库内所有项目(文件夹+文件),-Limit All确保返回全部 $items = Get-SPOListItem -List $lib -Site $site.Url -Limit All foreach ($item in $items) { # 区分文件夹和文件 if ($item.FileSystemObjectType -eq "Folder") { Write-Host " 文件夹路径: $($item.FieldValues.FileRef)" } else { Write-Host " 文件路径: $($item.FieldValues.FileRef) | 大小: $($item.FieldValues.File_x0020_Size)字节" } } } }
关键说明
Get-SPOSite -Limit All:必须加上这个参数,否则默认只返回前200个站点Get-SPOList的筛选条件:只获取BaseType为DocumentLibrary的列表,同时排除隐藏的系统库(比如表单模板库等)FileSystemObjectType:用来判断当前项目是文件夹还是文件,FileRef是SharePoint内的服务器相对路径,File_x0020_Size是文件的字节大小
更高效的替代方案(PnP PowerShell)
如果需要处理大量站点或文件,推荐使用PnP PowerShell模块,它支持递归获取子文件夹、分页加载等更实用的功能:
步骤1:安装PnP模块
Install-Module -Name PnP.PowerShell -Force -AllowClobber
步骤2:PnP脚本示例
# 连接管理员中心 Connect-PnPOnline -Url https://mycompany-admin.sharepoint.us -Interactive # 获取所有站点(包含OneDrive站点) $sites = Get-PnPTenantSite -IncludeOneDriveSites -Limit All foreach ($site in $sites) { Write-Host "===== 正在处理站点: $($site.Url) =====" -ForegroundColor Cyan # 切换到当前站点的上下文 Connect-PnPOnline -Url $site.Url -Interactive # 筛选非隐藏文档库 $documentLibraries = Get-PnPList | Where-Object { $_.BaseType -eq "DocumentLibrary" -and $_.Hidden -eq $false } foreach ($lib in $documentLibraries) { Write-Host "--- 处理文档库: $($lib.Title) ---" -ForegroundColor Green # 递归获取所有子文件夹和文件,分页加载避免超时 $items = Get-PnPListItem -List $lib -PageSize 500 -ScriptBlock { Param($items) $items } -Recursive foreach ($item in $items) { if ($item.FileSystemObjectType -eq "Folder") { Write-Host " 文件夹路径: $($item.FieldValues.FileRef)" } else { Write-Host " 文件路径: $($item.FieldValues.FileRef) | 大小: $($item.FieldValues.File_x0020_Size)字节" } } } }
注意事项
- 权限要求:你的账号需要拥有SharePoint管理员或全局管理员权限,才能访问所有站点和文档库
- 性能优化:如果站点数量多、文件量大,建议将输出内容写入日志文件(比如使用
Out-File或Add-Content),避免控制台输出卡顿 - 自定义筛选:可以根据需求添加站点过滤条件(比如
Where-Object { $_.Url -notlike "*my.sharepoint.us/personal*" }排除OneDrive站点)或文件类型过滤
内容的提问来源于stack exchange,提问作者ppayan
相关产品推荐
相关产品推荐

