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?
3 Réponses :
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 . P >
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".
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
Je suggère d'utiliser:
Where-Object avec l'opérateur -match basé sur RegEx pour obtenir uniquement les noms d'utilisateur commençant par CloudTest et 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
Un UPN est un nom de style Internet, tel que
CloudTest21@YourDomain.com. Vous affichez une liste de DisplayNames. Si vous remplacezCloudTestdans l'UPN, vous êtes keft par21@YourDomain.comqui 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
CloudTest001versCloudTest100@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îneImpossible 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 []]).