PowerShell与数组字符串元素匹配的奇怪行为

时间:2014-03-26 13:43:36

标签: arrays powershell powershell-v3.0 powershell-ise

我非常渴望得到这些提示。这是我的窘境:

首先,我有一个字符串数组,我用这种方式创建(显示数字的子集):

$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。

3 个答案:

答案 0 :(得分:2)

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

$a = @"
00013120747
00013051436
00013110491
00002100011
"@

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

$aa[2] -eq "00013110491"

True

-match将匹配字符串中的任何位置,因此它甚至会与尾随空格匹配。 -eq要求和完全匹配,字符的字符和尾随空格将导致它返回False。

答案 1 :(得分:1)

$a = @"
00013120747
00013051436
00013110491
00002100011
"@

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

答案 2 :(得分:-2)

你正在使用这里的字符串。这样的语法:

$String = @"
entry1
entry2
entry3
"@

$String.Count
 >1

您需要首先拆分此字符串,然后才能比较它们。如果你看看你运行时实际得到的东西

 $a[2]
 > '0'

您要求PowerShell提供第二个索引位置。这意味着这一点。 00 [0] 13120747

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

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