Как уже отмечалось, вы сортируете по алфавиту там, где ожидаете числовую сортировку.Вот почему вы должны преобразовать строку, содержащую число в целое число, с [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
.
Надеюсь, это поможет