如何在 PowerShell 中比较包含 & 符号的字符串



我正在使用PowerShell来比较两个带有与号(&)的字符串(即字符串"Policy & Procedures")。

无论我怎么尝试,我都无法让这些字符串匹配。我尝试修剪字符串以去除多余的空格。我尝试将字符串包装在单引号和双引号(以及两者的组合)中:

"Policies & Procedures"
'Policies & Procedures'
"'Policies & Procedures'"

我用来比较字符串的代码是:

if ($term1 -eq $term2) {
do something
}

直观地检查字符串 - 它们是相同的,但是 if 语句的计算结果永远不会为 true。有没有办法比较这两个字符串,以便它的计算结果为 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
}

我已经打印了这两个术语。名称和术语名称到屏幕上,它们是相同的。如果字符串中没有 & 符号,则此函数有效。如果有与号,则此函数失败。这就是我如何知道与号是问题所在。

这是一个已知的怪癖:

在以下情况下,您需要注意两种类型的 & 符号 玩 SharePoint 分类

我们最爱和最爱

  • &ASCII 编号:38

和冒名顶替者

  • ASCII 编号:65286

在阅读了尼克·霍布斯的这篇文章后,很明显 当您创建术语时,它会将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
}

将两个字符串转换为 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
}

相关内容

  • 没有找到相关文章

最新更新