如何用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就方便多了。

相关推荐
wei_shuo1 小时前
KES 数据库开发运维手记:部署、安全、备份与监控实战
后端
foggyprojects2 小时前
层级查询为什么不能只靠 parent_id
后端
二月龙2 小时前
接口慢到被骂?教你5招把响应速度砍掉一半
后端
我登哥MVP2 小时前
Spring Boo从“会用”到“精通”:Spring Boot 入门
java·spring boot·后端·spring·maven·intellij-idea·mybatis
无风听海2 小时前
深入解析 ASP.NET Core 中的 Request.Cookies:从 HTTP 协议到加密存储与执行时序
后端·http·asp.net
染翰2 小时前
Java 实现 Git 自动克隆工具,打包成 Windows 独立 EXE(免安装JDK)
java·git·后端
程序员cxuan2 小时前
Codex 一直 Reconnecting?我最后发现,常见就两个坑
人工智能·后端·程序员
程序员海军2 小时前
沪漂五周年了:我越来越迷茫了
前端·人工智能·后端
fox_lht2 小时前
13.3.测试的组织方式
开发语言·后端·rust