如何比较字符串末尾的数字值?

时间:2019-01-29 09:10:36

标签: powershell

我创建了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 :(得分:1)

我建议使用:

  • 一个Where-Object与基于RegEx的-match运算符,以从CloudTest和
  • 开头的用户名
  • 捕获自动存储在$ Matches [1]变量中的组()中的数字
  • 使用脚本块ToNaturalRoman 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

希望有帮助