2
votes

Comment comparer les valeurs des nombres qui sont à la fin de la chaîne?

J'ai créé 100 utilisateurs cloud avec des UPN et des noms CloutTest1 à CloudTest100. Comment puis-je filtrer / obtenir ces utilisateurs en fonction de leurs numéros? par exemple. utilisateurs entre 30 et 40

J'ai essayé

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

résultats

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

Je ne sais pas pourquoi il ne trie pas et je n'ai aucune idée d'où vient le «100».

Comment puis-je obtenir des nombres entre 30 et 45? Pourquoi les éléments ci-dessus ne sont-ils pas triés?


8 commentaires

Un UPN est un nom de style Internet, tel que CloudTest21@YourDomain.com . Vous affichez une liste de DisplayNames. Si vous remplacez CloudTest dans l'UPN, vous êtes keft par 21@YourDomain.com qui ne se compare pas à la valeur entière de 50 ..


$ _. userprincipalname.replace ('CloudTest', '') -> [int] $ _. userprincipalname.replace ('CloudTest', '')


Quant au tri: le tri que vous essayez est un tri alphabétique. Ce que vous voulez, c'est un tri numérique. Vous auriez pu faire mieux en utilisant vos utilisateurs de test CloudTest001 vers CloudTest100


@Theo Pas nécessairement. Le tri numérique peut être effectué comme ceci: Sort-Object {[int] $ _. Userprincipalname.replace ('CloudTest', '')} .


@AnsgarWiechers Oui, je sais, mais l'OP aurait pu lui rendre la vie beaucoup plus facile en utilisant des zéros non significatifs dans les noms des utilisateurs de test. C'est tout ce que je dis ici. Voir également mon premier commentaire sur le format UPN. Le replace ('CloudTest', '') ne suffirait pas car il vous reste toujours le reste de la chaîne.


C'est vrai, mais nous ne savons pas si la modification des UPN est une option pour l'OP.


Bonjour, [int] $ _. Userprincipalname.replace ('CloudTest', '') entraîne Impossible de convertir la valeur "System.Object []" de type "System.Object [] "pour taper" System.Int32 ". Changer les UPN est sûrement une option. Quelle serait la meilleure façon de créer des utilisateurs avec 001 010 100 etc. à la fin?


Si votre objet utilisateur a plusieurs UPN, vous devez soit en choisir un pour le cast en int, soit tous les convertir en un tableau int ( [int []] ).


3 Réponses :


0
votes

Vous êtes mordu par la comparaison chaîne-entier. Le tri est une opération étonnamment délicate. Il n'est pas évident que le tri s'effectue par ordre de dictionnaire, par magnitude ou tri naturel .

Dans ce cas, "100" est une chaîne, pas un nombre. Comme le premier caractère est "1" plus petit que "5", c'est tout ce qui compte. Pour les entiers, "100" est évidemment plus grand que "50".


0 commentaires

0
votes

Comme déjà commenté, vous triez par ordre alphabétique là où vous attendez un tri numérique. C'est pourquoi vous devez convertir la chaîne qui contient un nombre en entier avec [int] .

Cela dit, un nom UserPrincipal a le format «de style Internet» tel que CloudTest21@YourDomain.com (vous pouvez en savoir plus sur ici )

Dans votre situation de test, je préférerais faire le Where-Object basé sur la propriété DisplayName :

CloudTest001
CloudTest002
...
CloudTest100


0 commentaires

1
votes

Je suggère d'utiliser:

  • un Where-Object avec l'opérateur -match basé sur RegEx pour obtenir uniquement les noms d'utilisateur commençant par CloudTest et
  • capture du nombre dans un groupe () automatiquement stocké dans la variable $ Matches [1]
  • tri du résultat avec un bloc de script ToNatural par Roman Kuzmin qui trie en remplaçant d'abord tous les nombres à une longueur égale en remplissant à gauche des zéros.

DisplayName
-----------
CloudTest49
CloudTest48
CloudTest47
CloudTest46
CloudTest45
%<...snip...>%

Exemple de sortie:

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


0 commentaires