SharePoint Online PnP PowerShell日期查询异常:返回全部项求解决
问题排查与解决方案
首先,你的查询返回全部项,大概率是两个原因:一是CAML查询的时间匹配逻辑不对,二是查询的XML格式/转义问题导致SharePoint没有正确解析筛选条件。
核心问题分析
你当前生成的$Today是带精确时分秒毫秒的UTC时间戳,但列表中Aviseringsdatum字段的时间值几乎不可能和这个精确值完全一致——哪怕是今日的那条数据,它的时间部分也可能是当天的某个其他时刻,不是你执行脚本时的精确时间。加上你设置了IncludeTimeValue='TRUE',这会要求完全匹配日期+时间,自然匹配不到目标项;如果查询语法还有小问题,SharePoint就会直接忽略筛选条件,返回所有项。
修复方案
方案1:匹配今日日期(忽略时间部分)
如果你只需要筛选日期为今日的项,不管具体时间,修改CAML查询,忽略时间匹配即可:
# 获取今日的日期部分(不带时间),格式化为SharePoint认可的格式 $TodayDate = (Get-Date).ToString("yyyy-MM-dd") # 使用Here-String编写CAML,避免转义问题 $query = @" <View> <Query> <Where> <Eq> <FieldRef Name='Aviseringsdatum' /> <Value IncludeTimeValue='FALSE' Type='DateTime'>$TodayDate</Value> </Eq> </Where> </Query> <ViewFields> <FieldRef Name='Title' /> <FieldRef Name='Aviseringsdatum' /> <FieldRef Name='Avtalsansvarig' /> </ViewFields> </View> "@ $ListItems = Get-PnPListItem -List "Avtal" -Query $query
方案2:匹配今日全天的时间范围(包含所有今日的时间点)
如果你的字段需要考虑时间,但要覆盖今日00:00到23:59的所有项,可以用Geq和Leq组合筛选:
# 获取今日0点的UTC时间 $startOfDay = (Get-Date).Date.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ") # 获取今日23:59:59的UTC时间 $endOfDay = (Get-Date).Date.AddDays(1).AddSeconds(-1).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ") $query = @" <View> <Query> <Where> <And> <Geq> <FieldRef Name='Aviseringsdatum' /> <Value IncludeTimeValue='TRUE' Type='DateTime'>$startOfDay</Value> </Geq> <Leq> <FieldRef Name='Aviseringsdatum' /> <Value IncludeTimeValue='TRUE' Type='DateTime'>$endOfDay</Value> </Leq> </And> </Where> </Query> <ViewFields> <FieldRef Name='Title' /> <FieldRef Name='Aviseringsdatum' /> <FieldRef Name='Avtalsansvarig' /> </ViewFields> </View> "@ $ListItems = Get-PnPListItem -List "Avtal" -Query $query
额外注意点
- 用PowerShell的**Here-String(@" ... "@)**编写CAML查询,比手动转义
<为<更不容易出错,可读性也更强。 - 确认
Aviseringsdatum是字段的内部名称(不是显示名称)——如果内部名称不一样,查询也会失效。你可以在SharePoint列表设置的字段详情页里看到内部名称。
内容的提问来源于stack exchange,提问作者AllramEst
相关产品推荐
相关产品推荐

