2014-03-26 64 views
0

我对这里的提示非常绝望。这里是我的困惑:PowerShell与数组字符串元素匹配的奇怪行为

首先,我有一个字符串数组,这是我创造了这个方式(显示号码的子集):

$a = @" 
00013120747 
00013051436 
00013110491 
00002100011 
"@ 

$aa = $a.Split("`n") 

接下来,我产生的所有用户的Active Directory中的列表(使用ActiveRoles)这样说:

$all_u = Get-QADUser -DontUseDefaultIncludedProperties -IncludedProperties Name,LogonName,EmployeeID -SizeLimit 0 

现在,我为什么不能匹配反对$aa数组的元素?例如,执行以下操作:

$all_u | where {$_.EmployeeID -match "00013110491"} 

它的工作原理。但是,如果我执行以下操作:

$all_u | where {$_.EmployeeID -match $aa[2]} 

它不起作用。

所以我做了一个简单的测试:

$aa.GetType().Name 
String[] 

$aa[2].GetType().Name 
String 

$aa[2] 
00013110491 

$aa[2] -eq "00013110491" 
False 

什么?这里发生了什么???顺便说一下,我正在使用PowerShell ISE。

回答

2

如果仔细检查$ aa的元素,您会发现它们都有尾随空格。这是对“`n”进行拆分的结果。如果您在完成拆分后修剪它们,则会得到预期结果。

$a = @" 
00013120747 
00013051436 
00013110491 
00002100011 
"@ 

$aa = $a.Split("`n") |% {$_.trim()} 

$aa[2] -eq "00013110491" 

True 

-match将匹配字符串中的任何位置,所以即使匹配尾部空格也是如此。 -eq需要和完全匹配,字符为character,尾随空格将导致它返回False。

+0

哇,很好找!我实际上尝试了'foreach($ aa $ aa){“== {0} ==”-f $ elem}',并且每行不显示任何尾部空格。谢谢你告诉我!标记你的答案。 – pepoluan

1
$a = @" 
00013120747 
00013051436 
00013110491 
00002100011 
"@ 

$aa = $a.Split("`r`n") 
+0

Aaah,我明白了......需要在'r上分开...... – pepoluan

-2

您正在使用here字符串。这样的语法:

$String = @" 
entry1 
entry2 
entry3 
"@ 

$String.Count 
>1 

您需要先分割您的这里字符串,然后才能比较它们。如果你看看你在运行时得到了什么

$a[2] 
> '0' 

你在问PowerShell的第二个索引位置。这意味着这一点。 00 [0] 13120747

这是因为here-string是单个字符串,它恰好包含多行。使用PowerShell数组索引,如果只有一个条目,您将从列表中取回该位置。

$string = "" 
$string[0..2] 
>012 
+0

你没看见我完成了吗? $ aa = $ a.Split(“'n”) – pepoluan

+1

我错过了。看起来Mjolinor在这里是正确的,这似乎是ISE中的一个错误,在每个角色的末端都注入了空间。检查每个条目的长度,他们在ISE中的长度是12个字符,而在控制台中工作时是11个字符。 – FoxDeploy