这可能是个新问题,但我已经花了几个小时在这个问题上。我正在创建一个powershell脚本,试图确定条目是否已经存在。(这是用于Exchange多租户解决方案的)此工作:
Get-GlobalAddressList ({$_.Identity -Like“\MyCompany_com*”)}
但这是失败的:
Get-GlobalAddressList ({$_.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"}
}写输出“显示”与字符匹配的字符。
我已经用许多语言编写了三十多年的脚本,但是这个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 ({$_.Name -Like“MCC”)}
然而,这确实符合:
Get-GlobalAddressList ({$_.Name -Like“MCC?GAL”)}
因此,除了空格字符之外,连字符(-)还会导致匹配问题。我确实试图避开连字符:"-",但仍然没有匹配。
有没有办法强制进行简单的字符串比较?用于构建比较字符串的方法将是我需要匹配的方法。
发布于 2013-10-06 20:02:17
当我为GetAddressList做了一个工作的时候,我的脚本的下一部分我被迫解决了这个问题。
决心:我和@power 2460798有着同样的担忧,但是我觉得可以忽略它,因为我用“普通”的破折号复制/粘贴到了power-shell线路上-- GlobalAddressList名称。事实证明,我们复制的示例命令包含了en-破折号。哎哟,吸取教训。为我和我的同事浪费了超过14个小时。#crying#
我最后偶然发现了一个脚本,How to convert a ascii string into a decimal representative string in a powershell script? ,经过一些小小的修改,我就可以发现AD中存储的值实际上是一个"en- dash ",char8211 (普通的破折号是char045)。
因此,下面是与我试图检索的条目相匹配的命令:
Get-GlobalAddressList | Where{$_.Name.replace([convert]::ToChar(8211),"-") -eq "MyCompany_com - GAL"}发布于 2013-10-06 01:47:25
如果您输入以下内容,您会得到什么:
"\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())
}
}看看身份财产里到底有什么。请注意,如果标识包含未转换为ASCII的Unicode字符,则需要将[byte[]]更改为[int16[]]
发布于 2013-10-06 16:09:17
事实证明,我能够匹配GlobalAddressList对象中的另一个对象:
Get-GlobalAddressList | Where{$_.ConditionalCustomAttribute1 -eq "MMC"}由于这是一个多租户解决方案,我们一直在为ConditionalCustomAttribute1对象添加一个值,该值(在我们的情况下)将是唯一的,因此适合于测试是否存在。
这没有回答最初的问题,但它解决了我的脚本任务。
https://stackoverflow.com/questions/19204227
复制相似问题