Как сравнить значения чисел, которые находятся в конце строки? - PullRequest
0 голосов
/ 29 января 2019

Я создал 100 облачных пользователей с UPN и именами от CloutTest1 до CloudTest100.Как я могу отфильтровать / получить этих пользователей по их количеству?например, пользователи между 30 и 40

Я пытался

get-msoluser -all | ? {$_.userprincipalname.replace('CloudTest','') -lt 50} | select DisplayName | Sort-Object -Descending

результаты

DisplayName 

CloudTest25 
CloudTest16 
CloudTest32 
CloudTest44 
CloudTest45 
CloudTest37 
CloudTest1  
CloudTest12 
CloudTest26 
CloudTest4  
CloudTest38 
CloudTest34 
CloudTest11 
CloudTest31 
CloudTest35 
CloudTest19 
CloudTest24 
CloudTest39 
CloudTest49 
CloudTest42 
CloudTest36 
CloudTest10 
CloudTest15 
CloudTest18 
CloudTest47 
CloudTest41 
CloudTest27 
CloudTest20 
CloudTest30 
CloudTest2  
CloudTest46 
CloudTest40 
CloudTest22 
CloudTest48 
CloudTest17 
CloudTest23 
CloudTest13 
CloudTest3  
CloudTest43 
CloudTest28 
CloudTest21 
CloudTest100
CloudTest5  
CloudTest33 
CloudTest14 
CloudTest29

Я не уверен, почему это не сортировка, и я понятия не имею, где '100 'пришли от.

Как я могу получить числа от 30 до 45?Почему вышеперечисленное не сортируется?

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Как уже отмечалось, вы сортируете по алфавиту там, где ожидаете числовую сортировку.Вот почему вы должны преобразовать строку, содержащую число в целое число, с [int].

Сказав это, имя UserPrincipal имеет формат «Интернет-стиль», например CloudTest21@YourDomain.com (вы можете прочитатьоб этом здесь )

В вашей тестовой ситуации я бы предпочел сделать Where-Object на основе свойства DisplayName:

Get-MsolUser -All | Where-Object {[int]($_.DisplayName -replace '^CloudTest', '') -lt 50} | 
    Select-Object DisplayName, 
                  @{Name = 'UserNumber'; Expression = {[int]($_.DisplayName -replace '^CloudTest', '')}} | 
    Sort-Object -Property UserNumber -Descending |
    Select-Object DisplayName

Если вы действительно хотитедля сравнения на UserPrincipalName, что-то подобное может сделать это:

Get-MsolUser -All | 
    Where-Object {[int]($_.UserPrincipalName.Split("@")[0] -replace '^CloudTest', '') -lt 50} | 
    Select-Object DisplayName, 
                  @{Name = 'UserNumber'; Expression = {[int]($_.UserPrincipalName.Split("@")[0] -replace '^CloudTest', '')}} | 
    Sort-Object -Property UserNumber -Descending |
    Select-Object DisplayName

Вы могли бы упростить для вас ситуацию, если бы использовали ведущие нули для чисел в именах, таких как

CloudTest001
CloudTest002
...
CloudTest100

Таким образом, даже алфавитно-цифровая сортировка будет отображаться нормально.

Забыл сказать: если вы хотите, чтобы пользователи имели номер в определенном диапазоне, вы можете просто заменить -lt 50 на -in 30..40 в предложении Where-Object.

Надеюсь, это поможет

0 голосов
/ 29 января 2019

Я предлагаю использовать:

  • a Where-Object с оператором -match на основе RegEx для получения только имен пользователей, начиная с CloudTest и
  • захват числа в group (), автоматически сохраняемого в переменной $ Matches [1]
  • , сортировка результата по блоку скрипта ToNatural по Роман Кузьмин , который сортирует, сначала заменяя все числаравной длине, добавив слева нули.

Get-MsolUser -All  | Where-Object {($_.userprincipalname -match '^CloudTest(\d+)') -and 
                                   [int]$Matches[1] -lt 50} | 
    Select DisplayName | 
       Sort-Object {[regex]::Replace($_.DisplayName,'\d+',{$args[0].Value.PadLeft(10,"0")})} -Desc

Пример вывода:

DisplayName
-----------
CloudTest49
CloudTest48
CloudTest47
CloudTest46
CloudTest45
%<...snip...>%
0 голосов
/ 29 января 2019

Вы укушены сравнением строки и целого числа.Сортировка - удивительно сложная операция.Это не очевидно, если сортировка происходит по словарному порядку, по величине или естественная сортировка порядок.

В этом случае «100» - это строка, а не число.Поскольку первый символ «1» меньше, чем «5», это все, что имеет значение.Для целых чисел «100» явно больше, чем «50».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...