如何通过PowerShell CSOM获取SharePoint Online列表最新版本条目
默认情况下SharePoint CSOM的List.GetItems()接口只会返回每个列表条目的最新活跃版本,不需要额外过滤历史版本。如果当前返回了所有历史版本,通常是误遍历了单条目版本集合、或是列表开启了内容审批未过滤非发布版本导致,可以通过以下方式修正:
修正后的完整代码
#加载SharePoint CSOM程序集 Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll" Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll" #配置参数 $SiteUrl = "XYZ" $ListName="ABC" #获取连接凭据 $Cred= Get-Credential $Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password) #初始化上下文 $Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteUrl) $Context.Credentials = $credentials #获取目标列表 $List = $Context.web.Lists.GetByTitle($ListName) #构造CAML查询,直接在服务端过滤状态为Returned的条目,同时加载版本判断所需字段 $Query = New-Object Microsoft.SharePoint.Client.CamlQuery $Query.ViewXml = @" <View Scope='RecursiveAll'> <ViewFields> <FieldRef Name='ID'/> <FieldRef Name='Title'/> <FieldRef Name='Status'/> <FieldRef Name='IsLatestVersion'/> <FieldRef Name='_ModerationStatus'/> </ViewFields> <Query> <Where> <Eq> <FieldRef Name='Status'/> <Value Type='Text'>Returned</Value> </Eq> </Where> </Query> </View> "@ $ListItems = $List.GetItems($Query) $Context.Load($ListItems) $Context.ExecuteQuery() write-host "符合条件的最新条目总数:"$ListItems.Count #遍历输出,双重保险校验是否为最新版本 $ListItems | ForEach-Object { # 仅保留最新版本,若开启内容审批可再加 $_["_ModerationStatus"] -eq 0 判断仅保留已发布版本 If ($_.IsLatestVersion -eq $true) { write-host "条目ID:"$_.ID write-host "条目标题:"$_["Title"] } }
关键修正点
- 原代码的条件判断使用了
=赋值符号,PowerShell中相等判断需用-eq,修改后直接在CAML查询中做服务端过滤,减少不必要的数据返回 - 新增加载
IsLatestVersion内置属性,遍历的时候可以直接判断是否为最新版本 - 若列表开启了内容审批功能,可额外增加
_ModerationStatus等于0的判断,仅保留已正式发布的最新公开版本
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

