如何用PnP Powershell实现search term(labels)功能

今天要说的是一个古老的技巧,CSOM时代的非物质文化遗产

大家知道,taxonomy是SharePoint内容管理的核心功能,一个term可以设置多个标签(label),你在原生的SharePoint界面可以直接搜索term(无论命中的是哪个标签)。

但是PnP Powershell却没有一个现成的命令去搜索term,只有Get-PnPTerm pnp.github.io/powershell/... 这个命令只会根据default label来找,不会看其他标签。

你要是想自己写个遍历,去拿所有的terms以及term里所有的标签,这样也很费事(你要遍历所有的children terms) 所以有没有更加简便的方法?

CSOM时代的遗老 LabelMatchInformation

PnP Powershell不支持search term的根本原因是Modern SharePoint的开发框架就没开放这个search term的接口。大家要实现这个功能需要使用古老的csom(Client Side Object Model),里面有个LabelMatchInformation类用来匹配term里的label,从而实现搜索term的功能

这个类是在Microsoft.SharePoint.Client.Taxonomy.dll 里的,以前CSOM时代写PowerShell还要先加载dll(Add-Type),不过现在PnP Powershell启动的时候已经帮你加载好了,我们可以直接用起来.

它生成的时候需要SharePoint Context作为参数

powershell 复制代码
$ctx=Get-PnPContext
$match = [Microsoft.SharePoint.Client.Taxonomy.LabelMatchInformation]::new($ctx)
$ts=Get-PnPTermSet -Identity  "Country" -TermGroup "Site Collection"

$match.TermLabel = "CN"
$match.StringMatchOption = "StartsWith"
$match.DefaultLabelOnly = $false
$match.ResultCollectionSize = 20
$match.TrimUnavailable = $true
$match.Lcid = 1033

$terms = $ts.GetTerms($match)
$ctx.Load($terms)
$ctx.ExecuteQuery()

这里的$match.StringMatchOption有两种选项,StartsWith 以及 ExactMatch (你可以跑[Microsoft.SharePoint.Client.Taxonomy.StringMatchOption].GetEnumNames()命令自己查看) DefaultLabelOnly为true的话就不会命中其他子标签了

我的示例里用CN作为China的别名

如果找不到的话,就会返回空集合

注意,$match.TrimUnavailable这个属性一定得设置,不然就报错

这是命中很多个term的示例

这样,在Powershell里实现search term就方便多了。

相关推荐
starzy19909 分钟前
Scala String操作:从插值器到正则的完整指南
开发语言·后端·scala
starzy199023 分钟前
Scala Array操作:从定长数组到ArrayBuffer的完整指南
开发语言·后端·scala
IT_陈寒24 分钟前
Python项目实战经验分享:为什么你的多进程日志会丢失?
前端·人工智能·后端
中二少年学编程1 小时前
Node版本管理使用手册
后端
modelmd1 小时前
Go 切片、映射常见使用场景
开发语言·后端·golang
mldong1 小时前
工作流引擎的退回修改:金额从 6666 改成 666,重提还是回到退回它的那个人
后端·架构
陈随易1 小时前
一个网吧网管,做了个网页,卖了 5000 万
前端·后端·程序员
深蓝AI11 小时前
Python 3.13 的 Queue.shutdown:异步消费者终于能正常收工了
后端
武子康11 小时前
MultiNet6 空闲崩溃:`EXCVADDR=0x8` 后又出现 `CORRUPT HEAP`
人工智能·后端·agent
武子康12 小时前
MultiNet7 每轮都 clean,ESP32-P4 内存为什么还在掉?
人工智能·后端·agent