2013-10-06 33 views
0

这可能是一个新问题,但我现在花了几个小时。 我正在创建一个powershell脚本,试图确定一个条目是否已经存在。 (这是一个Exchange多租户解决方案) 这工作:带连字符的Powershell-like语法

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废话让我感到莫名其妙。 #沮丧#

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

因此,除了空格字符,连字符( - )也造成匹配问题。我确实试图摆脱连字符:“ - - ”,但仍然没有匹配。

是否有任何方式强制一个简单字符串比较? 我用来构建比较字符串的方法将是我需要匹配的。

+0

输出字符序号?您可能有一个嵌入式制表符,在显示时变成空格或可能是连字符而不是常规连字符/短划线字符。像'foreach($ PropVal $ Prop.Name){Write-Output [int] $ PropVal}'应该有希望工作。将该输出与相同代码的输出进行比较,用'$ NewVal'代替'$ Prop.Name'。我会使用-match与正则表达式,允许任何间距字符如果 - 样失败,但我也是PS新手,所以也许这是一个天真的解决方案。至少,它会确认空间是否是问题。 –

+0

我希望我能得到[int]语法的工作,这将是很好的验证,但多次尝试没有返回字符代码希望。碰巧,我在文本文件中复制/粘贴了创建该条目的原始命令,并且将完全相同的文本复制/粘贴到我的PS脚本中。所以除非AD在做某种类型的覆盖,这应该是完全相同的文字。谢谢你的建议! –

+0

'Where {[string] :: Compare($ _。Name,“MCC-GAL”,$ True)}'via [Microsoft](http://technet.microsoft.com/zh-cn/library/ee692804。 ASPX)?但是,我不会在其中存储太多的股票,但是,看看“CompareTo”方法如何被描述为不区分大小写的比较,但两个样本字符串尽管除了大小写相同,仍然没有相同的比较。我希望有所帮助。这真的不应该是这样的困难........ -_- –

回答

3

虽然我有一个GetAddressList的解决方法,我的脚本的下一部分我被迫弄清楚这个问题。

测定:我与@ user2460798共享相同的关注点,但由于我将复制/粘贴到Power-shell行的GlobalAddressList名称与“普通”破折号,因此感到安全无视。事实证明,我们复制的示例命令包含了连字符。呃,经验教训。这对我的同事和我来说浪费了14个多小时。 #哭泣#

我终于偶然发现了一个脚本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"} 
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包含不转换为ASCII的Unicode字符,则需要将[byte []]更改为[int16 []]

+0

谢谢你的建议,但没有更接近。没有检测到隐藏字符: '\ M y C o m p a n y _ c o m - G A L' –

+0

因此$ _。identity字符串与字符串“\ MyCompany_com - GAL”具有完全相同的一组字节值? (你可以用常量字符串做同样的事情,就像$ _。identity一样)它们每个都有20个长度,这些值是:92,77,121,67,111,109,112,97,110,121,95, 99,111,109,32,45,32,71,65,76 ??这是什么给你:'“\ MyCompany_com - GAL”-Like“\ MyCompany_com - GAL”' –

+0

抱歉没有回答第一个问题,简单的比较返回true。我无法使字节语法工作:'意外的标记'[byte []] [char []] $ _。标识'在表达式或语句中.'同样,感谢您的建议!我会再次尝试字节语法。 –

0

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

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

有了这个是一个多租户解决方案,我们已经增加了价值,ConditionalCustomAttribute1对象,即(在我们的情况)将是唯一的,因此适合用于测试的存在。

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

0

我碰到这个帖子跑在检索-Filter开关语法。您的第一个脚本示例是正确的,因为类似的开关应该与通配符一起使用。尝试在第二个脚本示例中用-Match(不是通配符)替换-Like。