Фильтрация / разделение выходных данных в PowerShell

#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 цифры строки. Вы можете прочитать об этом здесь