我使用PowerShell来比较两个字符串,其中包含&符号(&)(即字符串“Policies& Procedures”)。
无论我尝试什么,我都无法让这些字符串匹配。我已经尝试修剪弦以摆脱额外的空白区域。我尝试用单引号和双引号(以及两者的组合)包装字符串:
"Policies & Procedures"
'Policies & Procedures'
"'Policies & Procedures'"
我用来比较字符串的代码是:
if ($term1 -eq $term2) {
do something
}
直观地检查字符串 - 它们是相同的,但if语句永远不会评估为true。有没有办法比较这两个字符串,以便它评估为真?
修改
我正在进行此字符串比较的上下文是在SharePoint网站的分类中查找术语名称。这是我正在使用的代码:
function getTerm($termName) {
foreach($term in $global:termset.Terms) {
$termTrimmed = $term.Name.trim()
Write-Host "term name = $termTrimmed" -foregroundcolor cyan
if ($termTrimmed -eq $termName) {
return $term
}
}
return null
}
我在屏幕上打印了term.Name和termName,它们是相同的。如果字符串中没有“&”符号,则此函数有效。如果有&符号,则此功能失败。这就是我所知道&符号的问题。
答案 0 :(得分:2)
这是known quirk:
您需要注意两种类型的&符号 使用SharePoint分类法
我们最喜欢和最喜欢的
&
ASCII号码:38
冒名顶替者
&
ASCII号码:65286
在this article之后阅读Nick Hobbs后,很明显 当你创建一个术语时,它用{替换
38
&符号65286
&符号。如果你想与你的比较,这就成了一个问题 原始来源(电子表格,数据库等),因为它们不再是 相同。
如Nick的文章所详述,你可以使用
TaxonomyItem.NormalizeName
方法创建“分类法”版本 你的字符串用于比较:
尝试此操作(未在真实SharePoint上测试):
function getTerm($termName)
{
foreach($term in $global:termset.Terms) {
$termNormalized = [Microsoft.SharePoint.Taxonomy.TaxonomyItem]::NormalizeName($term.Name)
if ($termNormalized -eq $termName) {
return $term
}
}
return null
}
答案 1 :(得分:1)
将两个字符串转换为char数组并比较&符号的unicode值后,问题就会显现出来。搜索字符串中使用的&符号的值为38,而从SharePoint术语库中返回的&符号的值为65286(称为完整的&符号,但看起来与屏幕上的常规&符号相同)。
解决方案是编写我自己的字符串比较函数,并考虑到&符号值的差异。这是代码:
function getTerm($termName) {
$searchChars = $termName.toCharArray()
$size = $searchChars.Count;
foreach($term in $global:termset.Terms) {
$match = $True
$chars = $term.Name.trim().toCharArray()
if ($size -eq $chars.Count) {
for ($i = 0; $i -lt $size; $i++) {
if ($searchChars[$i] -ne $chars[$i]) {
# handle the difference between a normal ampersand and a full width ampersand
$charCode1 = [int] $searchChars[$i]
$charCode2 = [int] $chars[$i]
if ((($charCode1 -eq 38) -or ($charCode1 -eq 65286 )) -and (($charCode2 -eq 38) -or ($charCode2 -eq 65286 ))) {
continue
} else {
$match = $False
break
}
}
}
} else {
$match = $False
}
if ($match -eq $True) {
return $term
}
}
return $null
}