这可能是一个新问题,但我现在花了几个小时。 我正在创建一个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 强制进行简单的字符串比较? 我用来构建比较字符串的方法将是我需要匹配的方法。
答案 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(无通配符)。