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

时间:2016-12-02 17:42:40

标签: string powershell compare

我使用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,它们是相同的。如果字符串中没有“&”符号,则此函数有效。如果有&符号,则此功能失败。这就是我所知道&符号的问题。

2 个答案:

答案 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
}