Странное поведение сопоставления 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, кстати.

3 ответа

Решение

Если вы внимательно изучите элементы $aa, вы обнаружите, что все они имеют конечный пробел. Это является следствием разделения на "n". Если вы урежете их после разделения, вы получите ожидаемый результат.

$a = @"
00013120747
00013051436
00013110491
00002100011
"@

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

$aa[2] -eq "00013110491"

True

Параметр -match будет совпадать в любом месте строки, поэтому он будет совпадать даже с завершающим пробелом. -Eq требует и точное совпадение, символ за символом, и завершающий пробел заставит его возвращать False.

$a = @"
00013120747
00013051436
00013110491
00002100011
"@

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

Вы используете здесь строку. Этот синтаксис, как это:

$String = @"
entry1
entry2
entry3
"@

$String.Count
 >1

Вам нужно сначала разделить строку здесь, прежде чем вы сможете сравнить их. Если вы посмотрите на то, что вы на самом деле получаете, когда вы бежите

 $a[2]
 > '0'

Вы просите PowerShell для второй позиции индекса. Это значит это. 00[0]13120747

Это потому, что здесь-строка - это одна строка, которая содержит несколько строк. При индексировании массива PowerShell, если есть только одна запись, вы вернете эту позицию из списка.

$string = "0123456"
$string[0..2]
 >012
Другие вопросы по тегам