我创建了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之间的数字?为什么上面的那些不排序?
答案 0 :(得分:1)
我建议使用:
Where-Object
与基于RegEx的-match
运算符,以从CloudTest和ToNatural
和Roman Kuzmin对结果进行排序,该脚本块的排序方式是先将所有数字替换为相等的长度,然后用零填充左数。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...>%
答案 1 :(得分:0)
您被字符串整数比较所困扰。排序令人惊讶地是一项棘手的操作。按字典顺序,幅度或natural sort顺序进行排序并不明显。
在这种情况下,“ 100”是字符串,而不是数字。因为第一个字符比“ 5”小“ 1”,所以这很重要。对于整数,“ 100”显然大于“ 50”。
答案 2 :(得分:0)
如上所述,您正在按字母顺序对希望进行数字排序的位置进行排序。
这就是为什么必须使用const methodName = arguments.callee.name
将包含数字的字符串转换为整数的原因。
如上所述,UserPrincipal名称具有“ Internet样式”格式,例如[int]
(您可以了解有关here的信息)
在您的测试情况下,我宁愿基于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
。
希望有帮助