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