#powershell #filtering
#powershell #фильтрация
Вопрос:
Я пытаюсь отфильтровать / разделить выходные данные, которые я получаю из этого кода:
Get-ADUser -Filter * -Properties proxyaddresses |
Where-Object {$_.proxyaddresses -Like "ixi*"} |
Select sAMAccountName, proxyaddresses
В разделе «proxyaddresses» есть номер, начинающийся с «ixi: 49», и еще некоторая информация, которая мне не нужна. Как я могу манипулировать этим кодом, чтобы получить только это число, а затем каким-то образом найти способ отфильтровать его еще больше, чтобы получить в качестве выходных данных только последние четыре цифры?
Ответ №1:
ProxyAddresses
является массивом, поэтому -Like
с этим работать не будет. Это может помочь, если я правильно понимаю вопрос (непроверенный)
$re = [regex]'ixi: 49.*(d{4})$'
Get-ADUser -Filter * -Properties ProxyAddresses |
Where-Object {$_.ProxyAddresses -match $re.toString()} |
Select-Object SamAccountName, ProxyAddresses,
@{Name = 'ixi'; Expression = {$re.Match($_.ProxyAddresses).Groups[1].Value}}
Подробности о регулярных выражениях:
ixi: Match the characters “ixi:” literally
Match the character “ ” literally
49 Match the characters “49” literally
. Match any single character that is not a line break character
* Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
( Match the regular expression below and capture its match into backreference number 1
d Match a single digit 0..9
{4} Exactly 4 times
)
$ Assert position at the end of the string (or before the line break at the end of the string, if any)
Комментарии:
1. В качестве отступления, поскольку из вашего ответа следует, что он
-like
не может использоваться с массивами:-like
точно так же, как-match
, может работать с массивами как LHS, а именно действуя как фильтр : он возвращает соответствующие элементы; например,'foo', 'bar', 'baz' -like 'b*'
возвращаетbar
иbaz
.2. Кроме того, поскольку вы используете
.Match()
, среди элементов массива будет найдено не более одного прокси-адреса, соответствующего регулярному выражению$_.ProxyAddresses
(который автоматически преобразуется в одну строку с единственным пробелом между элементами).3. @mklement0 Спасибо за объяснение. Никогда не осознавал, что
-like
так работает с массивами.4. @Theo, не могли бы вы, пожалуйста, сказать мне, что {Groups[1].Value} на самом деле означает в написанном вами коде?
5. @user11124311 Возвращает значение первой (и в данном случае единственной) группы захвата регулярного выражения. Это часть между скобками:
(d{4})
где фиксируются последние 4 цифры строки. Вы можете прочитать об этом здесь