0

这可能是一个新手问题,但我现在已经花了几个小时。我正在创建一个 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"}
}

写入输出“显示”字符匹配字符。

3 多年来,我使用多种语言编写脚本,但这个 PowerShell 废话让我感到困惑。#沮丧的#

---- 编辑#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"}

但是,这确实匹配:

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

因此,除了空格字符之外,连字符 (-) 也会导致匹配问题。我确实尝试过转义连字符:“\-”,但仍然不匹配。

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

4

4 回答 4

3

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

决心:我与@user2460798 有同样的担忧,但我觉得可以放心忽略,因为我已经将带有“正常”破折号的 GlobalAddressList 名称复制/粘贴到 power-shell 行。事实证明,我们复制的示例命令包含破折号。呵呵,吸取教训了。为我和我的同事浪费了超过 14 个小时。#哭泣#

我终于偶然发现了一个脚本,如何在 powershell 脚本中将 ascii 字符串转换为十进制代表字符串? ,通过一些细微的修改,我能够发现存储在 AD 中的值实际上是一个“破折号”,[char]8211(正常的破折号是 [char]045)。

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

Get-GlobalAddressList | Where{$_.Name.replace([convert]::ToChar(8211),"-") -eq "MyCompany_com - GAL"}
于 2013-10-06T20:02:17.253 回答
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[]]

于 2013-10-06T01:47:25.053 回答
0

事实证明,我能够匹配 GlobalAddressList 对象中的不同对象:

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

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

这没有回答最初的问题,但它解决了我的脚本任务。

于 2013-10-06T16:09:17.983 回答
0

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

于 2014-03-01T14:29:22.993 回答