类似Powershell的语法与连字符

时间:2013-10-06 00:45:07

标签: powershell exchange-server sql-like

这可能是一个新问题,但我现在花了几个小时。 我正在创建一个powershell脚本,试图确定一个条目是否已经存在。 (这适用于Exchange多租户解决方案) 这有效:

Get-GlobalAddressList | Where{$_.Identity -Like "\MyCompany_com*"}

但这失败了:

Get-GlobalAddressList | Where{$_.Identity -Like "\MyCompany_com - GAL"}

由于某些原因我无法理解,条目中的空格将不匹配。

是的,我确定条目\MyCompany_com - GAL存在。 我尝试过使用-match,-eq,-contains我能想到的每一个组合 任何帮助表示赞赏!

----编辑----------------------

尝试了一个新的机智,仍然悲惨地失败:

$NewVal = "\MyCompany_com - GAL"
$Prop = Get-GlobalAddressList | Select Name
foreach($PropVal in $Prop.Name){
  write-output "comparing: $NewVal to $PropVal"
  if($NewVal -like $PropVal){write-output "MATCH"} else {write-output "no-match"}
}

写输出'显示'字符的匹配字符。

我用多种语言编写了30多年的脚本,但这个PowerShell垃圾让我感到困惑。 #frustrated#

----编辑#2(显示输出)----------------------

comparing: MyCompany_com - GAL to MyCustomer_com - GAL
no-match
comparing: MyCompany_com - GAL to MyCompany_com - GAL
no-match
comparing: MyCompany_com - GAL to Default Global Address List
no-match

任何强制进行字符串比较的方法?

太空人物是否还在弄乱我?

----编辑#3(仍在尝试)----------------------

我故意创建了一个新的GlobalAddressList:"MCC-GAL",没有空格。

这仍然不起作用:

Get-GlobalAddressList | Where{$_.Name -Like "MCC-GAL"}

然而,这个DOES匹配:

Get-GlobalAddressList | Where{$_.Name -Like "MCC?GAL"}

因此除了空格字符外,连字符( - )也会导致匹配问题。我试图逃避连字符:“\ - ”,但仍然没有匹配。

是否 ANY WAY 强制进行简单的字符串比较? 我用来构建比较字符串的方法将是我需要匹配的方法。

4 个答案:

答案 0 :(得分:3)

虽然我有一个GetAddressList的解决方法,但是我的脚本的下一部分我被迫找出了这个问题。

确定:我和@ user2460798有同样的关注,但是我可以放心,因为我已经使用“普通”破折号将GlobalAddressList名称复制/粘贴到power-shell行。事实证明,我们复制的示例命令包含en-dash。哎呀,吸取了教训。对我的同事和我来说浪费了14个多小时。 #crying#

我终于偶然发现了一个脚本How to convert a ascii string into a decimal representative string in a powershell script? ,经过一些细微的修改,我能够揭示存储在AD中的值实际上是一个“en-dash”,[char] 8211(正常的破折号)是[char] 045)​​。

因此,这是与我试图检索的条目匹配的命令:

Get-GlobalAddressList | Where{$_.Name.replace([convert]::ToChar(8211),"-") -eq "MyCompany_com - GAL"}

答案 1 :(得分:0)

如果您输入以下内容,您会得到什么:

"\MyCompany_com - GAL" -like "\MyCompany_com - GAL"

如果可行,则强烈建议$ _.Identity属性中包含一些与您的想法不同的字符。以下是一种可以准确查看字符串包含的字符的方法:

[char[]]$stringWithOddCharacters   # breaks the string into characters
[byte[]][char[]]$stringWithOddCharacters   # converts each character into a byte

所以你可以做类似

的事情
Get-GlobalAddressList | foreach-object {
  if ($_.Identity -Like "\MyCompany_com*") {
    [char[]]($_.Identity.ToString())
    [byte[]][char[]]($_.Identity.ToString())
  }
}

准确查看Identity属性中的内容。请注意,如果Identity包含不转换为ASCII的Unicode字符,则需要将[byte []]更改为[int16 []]

答案 2 :(得分:0)

事实证明,我能够匹配GlobalAddressList对象中的另一个对象:

Get-GlobalAddressList | Where{$_.ConditionalCustomAttribute1 -eq "MMC"}

由于这是一个多租户解决方案,我们一直在为ConditionalCustomAttribute1对象添加一个值,(在我们的情况下)将是唯一的,因此适合测试是否存在。

这不回答原始问题,但它解决了我的脚本任务。

答案 3 :(得分:0)

我在搜索-Filter切换语法时遇到了这篇文章。您的第一个脚本示例是正确的,因为-like开关应该与通配符一起使用。在第二个脚本示例中尝试替换-Like with -Match(无通配符)。