今天要说的是一个古老的技巧,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作为参数
$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就方便多了。