Comment générer des noms et des numéros de téléphone aléatoires avec PowerShell
Lorsque vous avez besoin d'un ensemble de données à des fins de test ou de démonstration et que cet ensemble doit représenter des informations d'identification personnelle, vous ne souhaitez généralement pas utiliser de données réelles représentant des personnes réelles. Ici, nous allons vous expliquer comment utiliser PowerShell pour générer une liste de noms et de numéros de téléphone aléatoires pour une telle occasion..
De quoi as-tu besoin
Avant de commencer, vous devez disposer d’outils et d’informations:
PowerShell
Ce script a été développé avec PowerShell 4.0 et sa compatibilité avec PowerShell 2.0 a également été testée. PowerShell 2.0 ou version ultérieure est intégré à Windows depuis Windows 7. Il est également disponible pour Windows XP et Vista dans le cadre de Windows Management Framework (WMF). Quelques détails supplémentaires, et des liens pour les téléchargements, sont ci-dessous.
- PowerShell 2.0 est livré avec Windows 7. Les utilisateurs de Windows XP SP3 et Vista (SP1 ou version ultérieure) peuvent télécharger la version WMF appropriée auprès de Microsoft dans KB968929. Il n'est pas pris en charge sur XP SP2 ou version antérieure, ni sur Vista sans SP1..
- PowerShell 4.0 est fourni avec Windows 8.1. Les utilisateurs de Windows 7 SP1 peuvent le mettre à niveau dans le cadre d’une mise à jour WMF à partir du Centre de téléchargement Microsoft. Il n'est pas disponible pour XP ou Vista.
Des noms
Vous aurez besoin de listes de noms pour alimenter le générateur aléatoire. Une excellente source pour un lot des noms, et des informations sur leur popularité (bien que cela ne sera pas utilisé pour ce script), est le United States Census Bureau. Les listes disponibles sur les liens ci-dessous sont très volumineuses, vous pouvez donc les réduire un peu si vous envisagez de générer plusieurs noms et numéros à la fois. Sur notre système de test, il fallait environ 1,5 seconde pour générer chaque paire nom / numéro à l'aide des listes complètes, mais votre kilométrage varie en fonction des spécifications de votre système..
- Noms de famille
- Prénoms masculins
- Prénoms féminins
Quelle que soit la source utilisée, vous devrez générer trois fichiers texte que le script peut utiliser comme pools pour la sélection de son nom. Chaque fichier ne doit contenir que des noms et un seul nom par ligne. Ceux-ci doivent être stockés dans le même dossier que votre script PowerShell.
Patronymes.txt devrait contenir les noms de famille que vous voulez que le script choisisse. Exemple:
Smith Johnson Williams Jones Brown
Males.txt doit contenir les prénoms masculins que vous souhaitez sélectionner dans le script. Exemple:
James John Robert Michael William
Females.txt doit contenir les prénoms de femme que vous voulez sélectionner dans le script. Exemple:
Mary Patricia Linda Barbara Elizabeth
Règles pour les numéros de téléphone
Si vous voulez vous assurer que vos numéros de téléphone ne correspondent pas au vrai numéro de quelqu'un, le moyen le plus simple est d'utiliser le code d'échange connu «555». Mais si vous voulez afficher un ensemble de données avec beaucoup de numéros de téléphone, ce 555 commencera à avoir l'air assez monotone très rapidement. Pour rendre les choses plus intéressantes, nous allons générer d'autres numéros de téléphone qui violent les règles du plan de numérotation nord-américain (NANP). Vous trouverez ci-dessous des exemples de numéros de téléphone non valides, représentant chaque classe de numéros générés par ce script:
- (157) 836-8167
Ce numéro est invalide car les indicatifs régionaux ne peuvent pas commencer par un 1 ou un 0. - (298) 731-6185
Ce numéro est invalide car le PNNA n’attribue pas d’indicatif régional avec le 9 comme deuxième chiffre.. - (678) 035-7598
Ce numéro n'est pas valide car les codes d'échange ne peuvent pas commencer par un 1 ou un 0. - (752) 811-1375
Ce numéro n'est pas valide car les codes d'échange ne peuvent pas se terminer par deux 1. - (265) 555-0128
Ce numéro n'est pas valide car le code d'échange est le 555, et l'identifiant d'abonné est compris dans la plage réservée aux numéros fictifs. - (800) 555-0199
Ce numéro est le seul numéro 800 avec un code d’échange 555 qui est réservé à un numéro fictif..
Notez que les règles ci-dessus sont sujettes à modification et peuvent varier d’une juridiction à l’autre. Vous devez effectuer vos propres recherches pour vérifier les règles en vigueur applicables aux paramètres régionaux pour lesquels vous allez générer des numéros de téléphone..
Commandes communes
Il y a quelques commandes assez communes qui vont être utilisées tout au long de ce script, vous devriez donc avoir une idée de base de ce que cela signifie avant de plonger dans l'écriture..
- Pour chaque objet prend un tableau ou une liste d'objets et effectue l'opération spécifiée sur chacun d'eux. Dans un bloc de script ForEach-Object, la variable $ _ est utilisée pour faire référence à l'élément en cours de traitement..
- sinon les instructions vous permettent d'exécuter une opération uniquement si certaines conditions sont remplies et (éventuellement) de spécifier l'action à exécuter lorsque cette condition n'est pas remplie.
- commutateur les déclarations sont comme si les déclarations avec plus de choix. Switch vérifie un objet par rapport à plusieurs conditions et exécute les blocs de script spécifiés pour les conditions auxquelles l'objet correspond. Vous pouvez également, en option, spécifier un bloc par défaut qui ne sera exécuté que si aucune autre condition ne correspond. Les instructions Switch utilisent également la variable $ _ pour faire référence à l'élément en cours de traitement..
- tandis que les instructions vous permettent de répéter en permanence un bloc de script tant qu'une condition donnée est remplie. Une fois que quelque chose arrive qui fait que la condition ne soit plus vraie quand le bloc de script est fini, la boucle se termine.
- essayer… attraper les instructions aident à la gestion des erreurs. Si quelque chose ne va pas avec le bloc de script spécifié pour try, le bloc catch sera exécuté..
- Obtenir du contenu fait ce qu'il dit sur l'étain. Il récupère le contenu d'un objet spécifié - généralement un fichier. Cela peut être utilisé pour afficher le contenu d'un fichier texte sur la console ou, comme dans ce script, transmettre le contenu le long du pipeline à utiliser avec d'autres commandes..
- Write-Host met des choses dans la console. Ceci est utilisé pour présenter des messages à l'utilisateur, et n'est pas inclus dans la sortie du script si la sortie est redirigée.
- Écriture-sortie génère réellement une sortie. Normalement, ceci est vidé sur la console mais il peut aussi être redirigé par d'autres commandes.
Il y a d'autres commandes dans le script, mais nous les expliquerons au fur et à mesure.
Construire le script
Maintenant il est temps de se salir les mains.
Partie 1: Se préparer à partir
Si vous souhaitez que votre script démarre à partir d'une console vierge, voici la première ligne que vous souhaitez.
Clear-Host
Maintenant que nous avons un écran vierge, nous voulons également vérifier le script pour nous assurer que tout ce dont il a besoin est en place. Pour ce faire, nous devons commencer par lui indiquer où chercher et quoi chercher..
$ ScriptFolder = Split-Path $ MyInvocation.MyCommand.Definition -Parent $ RequiredFiles = ('Males.txt', 'Females.txt', 'Surnames.txt')
La première ligne est très utile pour tout script. Il définit une variable qui pointe vers le dossier contenant le script. Ceci est essentiel si votre script nécessite d’autres fichiers situés dans le même répertoire que lui-même (ou un chemin relatif connu depuis ce répertoire), car vous rencontreriez sinon des erreurs si et lorsque vous essayez d’exécuter le script alors que vous êtes dans un autre. directeur de travail.
La deuxième ligne crée un tableau de noms de fichiers nécessaires au bon fonctionnement du script. Nous allons utiliser ceci, avec la variable $ ScriptFolder, dans la pièce suivante où nous vérifions que ces fichiers sont présents..
$ RequiredFiles | ForEach-Object if (! (Test-Path "$ ScriptFolder \ $ _")) Write-Host "$ _ non trouvé." -ForegroundColor Red $ MissingFiles ++
Ce fragment de script envoie le tableau $ RequiredFiles dans un bloc ForEach-Object. Dans ce bloc de script, l'instruction if utilise Test-Path pour voir si le fichier que nous recherchons correspond à son emplacement. Test-Path est une commande simple qui, lorsqu'un chemin de fichier est fourni, renvoie une réponse de base vraie ou fausse pour nous indiquer si le chemin pointe vers quelque chose qui existe. Le point d'exclamation dans il y a un ne pas opérateur, qui inverse la réponse de Test-Path avant de la transmettre à l'instruction if. Donc, si Test-Path renvoie false (le fichier que nous recherchons n'existe pas), il sera converti en true afin que l'instruction if exécute son bloc de script..
Une autre chose à noter ici, qui sera souvent utilisée dans ce script, est l'utilisation de guillemets doubles au lieu de guillemets simples. Lorsque vous mettez un élément entre guillemets simples, PowerShell le traite comme une chaîne statique. Tout ce qui se trouve dans les guillemets simples sera transmis tel quel. Les guillemets doubles indiquent à PowerShell de traduire les variables et certains autres éléments spéciaux dans la chaîne avant de la transmettre. Ici, les doubles guillemets signifient qu'au lieu de courir Chemin de test '$ ScriptFolder \ $ _' nous allons réellement faire quelque chose de plus semblable à Test-Path 'C: \ Scripts \ Surnames.txt' (en supposant que votre script se trouve dans C: \ Scripts et que ForEach-Object travaille actuellement sur 'Surnames.txt').
Write-Host publiera un message d'erreur en rouge pour vous indiquer le fichier manquant pour chaque fichier non trouvé. Ensuite, il incrémente la variable $ MissingFiles qui sera utilisée dans la pièce suivante, à l'erreur et à quitter s'il manque des fichiers..
if ($ MissingFiles) Write-Host "Impossible de trouver le (s) fichier (s) source (s) $ MissingFiles. Abandon du script." -ForegroundColor Red Remove-Variable ScriptFolder, RequiredFiles, MissingFiles Exit
Voici une autre astuce que vous pouvez faire avec les déclarations if. La plupart des guides que vous verrez sur les instructions vous indiqueront s'il est nécessaire de faire appel à un opérateur pour rechercher une condition correspondante. Par exemple, ici nous pourrions utiliser if ($ MissingFiles -gt 0) pour voir si $ MissingFiles est supérieur à zéro. Cependant, si vous utilisez déjà des commandes qui renvoient une valeur booléenne (comme dans le bloc précédent où nous utilisions Test-Path), ce n'est pas nécessaire. Vous pouvez également vous en passer dans des cas comme celui-ci, lorsque vous effectuez simplement des tests pour voir si un nombre est non nul. Tout nombre non nul (positif ou négatif) est traité comme vrai, alors que zéro (ou, comme cela peut arriver, une variable inexistante) sera traité comme faux.
Si $ MissingFiles existe et est non nul, Write-Host postera un message vous indiquant le nombre de fichiers manquants et indiquant que le script sera annulé. Ensuite, Remove-Variable nettoiera toutes les variables que nous avons créées et Exit quittera le script. Dans la console PowerShell standard, l'option Remove-Variable n'est pas vraiment nécessaire dans ce but particulier, car les variables définies par les scripts sont normalement ignorées lors de la fermeture du script. Cependant, PowerShell ISE se comporte un peu différemment, vous pouvez donc le conserver si vous envisagez d'exécuter le script à partir de là..
Si tout est en ordre, le script continue. Une autre préparation à faire est un alias que nous serons très heureux d’avoir plus tard.
New-Alias g Get-Random
Les alias sont utilisés pour créer des noms alternatifs pour les commandes. Celles-ci peuvent être utiles pour nous aider à nous familiariser avec la nouvelle interface (par exemple: PowerShell a des alias intégrés tels que dir -> Get-ChildItem et chat -> Get-Content) ou de faire des références abrégées pour les commandes couramment utilisées. Ici, nous faisons un très référence abrégée pour le Obtenir au hasard commande qui va être utilisé beaucoup plus tard.
Get-Random fait à peu près ce que son nom implique. Étant donné un tableau (comme une liste de noms) en entrée, il sélectionne un élément aléatoire du tableau et le recrache. Il peut également être utilisé pour générer des nombres aléatoires. La chose à retenir à propos de Get-Random et des nombres est que, comme beaucoup d’autres opérations informatiques, il commence à compter à partir de zéro. Donc au lieu de Get-Random 10 signifiant le plus naturel "donnez-moi un nombre de 1 à 10" cela signifie vraiment "donnez-moi un nombre de 0 à 9." Vous pouvez être plus précis sur la sélection de numéro, de sorte que Get-Random se comporte davantage comme vous le feriez naturellement attendre, mais on n'en aura pas besoin dans ce script.
Partie 2: Obtenir les commentaires des utilisateurs et se mettre au travail
Bien qu'un script qui ne génère qu'un nom et un numéro de téléphone aléatoires soit un choix formidable, il est préférable qu'il permette à l'utilisateur de spécifier le nombre de noms et de numéros qu'il souhaite obtenir par lot. Malheureusement, nous ne pouvons pas vraiment faire confiance aux utilisateurs pour qu’ils fournissent toujours une entrée valide. Donc, il y a un tout petit peu plus que cela $ UserInput = Read-Host.
while (! $ ValidInput) try [int] $ UserInput = Read-Host -Prompt 'Éléments à générer' $ ValidInput = $ true catch Write-Host 'Saisie non valide. Entrez un nombre seulement. ' -ForegroundColor Red
L'instruction while ci-dessus vérifie et annule la valeur de $ ValidInput. Tant que $ ValidInput est false ou n'existe pas, il continuera à parcourir son bloc de script.
L'instruction try accepte les entrées de l'utilisateur, via Read-Host, et tente de les convertir en valeur entière. (C'est le [int] avant Read-Host.) En cas de succès, $ ValidInput est défini sur true afin que la boucle while puisse se terminer. En cas d'échec, le bloc catch génère une erreur et, comme $ ValidInput n'a pas été défini, la boucle while revient et invite à nouveau l'utilisateur..
Une fois que l'utilisateur a correctement entré un numéro, nous voulons que le script annonce qu'il est sur le point de commencer à faire son travail et qu'il commence à le faire..
Write-Host "'nGenerating $ UserInput noms et numéros de téléphone. Please be patient.'n" 1… $ UserInput | ForEach-Object
Ne vous inquiétez pas, nous ne vous laisserons pas vous débrouiller seuls pour trouver le code du générateur de noms et de numéros aléatoires. Ceci est juste un commentaire d’espace réservé pour vous montrer où va se situer la prochaine section (où le vrai travail est fait).
La ligne Write-Host est assez simple. Il indique simplement le nombre de noms et de numéros de téléphone que le script va générer et demande à l'utilisateur de faire preuve de patience pendant que le script fait son travail. le'n au début et à la fin de la chaîne est d'insérer une ligne vide avant et après cette sortie, juste pour lui donner une distinction visuelle entre la ligne d'entrée et la liste des noms et des nombres. Sachez qu’il s’agit d’un tic-tac (AKA «accent grave» - généralement la touche au-dessus de l’onglet, à gauche de 1) et non une apostrophe ou une simple citation devant chaque n.
La partie suivante montre une manière différente d'utiliser une boucle ForEach-Object. En règle générale, lorsque vous souhaitez qu'un bloc de script s'exécute un certain nombre de fois, vous configurez une boucle for régulière comme for ($ x = 1; $ x -le $ UserInput; $ x ++) . ForEach-Object nous permet de simplifier ceci en lui fournissant une liste d’entiers et, au lieu de lui demander de faire quoi que ce soit avec ces entiers, nous lui donnons simplement un bloc de script statique à exécuter jusqu’à épuisement des entiers pour le faire..
Partie 3: Générer un nom aléatoire
Générer le nom est le bit le plus simple du reste de ce processus. Il ne comporte que trois étapes: choisir un nom de famille, choisir un sexe et choisir un prénom. Vous vous souvenez de cet alias que nous avons créé pour Get-Random il y a quelque temps? Il est temps de commencer à utiliser ça.
$ Surname = Get-Content "$ ScriptFolder \ Surnames.txt" | g $ Male = g 2 si ($ Male) $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" | g else $ FirstName = Get-Content "$ ScriptFolder \ Females.txt" | g
La première ligne prend notre liste de noms de famille, l’alimente dans le sélecteur aléatoire et attribue le nom choisi à $.
La deuxième ligne choisit le sexe de notre personne. Rappelez-vous comment Get-Random commence à compter à partir de zéro, et comment zéro est faux et tout le reste est vrai? C'est comme ça qu'on utilise Get-Random 2 (ou le beaucoup plus court g 2 grâce à notre alias - les deux résultent en un choix entre zéro ou un) pour décider si notre personne est un homme ou non. La déclaration if / else choisit ensuite au hasard un prénom masculin ou féminin en conséquence.
Partie 4: Générer un numéro de téléphone aléatoire
Voici la partie vraiment amusante. Plus tôt, nous vous avons montré comment vous pouvez créer un numéro de téléphone non valide ou fictif. Étant donné que nous ne voulons pas que tous nos numéros se ressemblent beaucoup, nous choisirons au hasard un format de numéro invalide à chaque fois. Les formats choisis au hasard seront définis par leur indicatif régional et leur code d’échange, qui seront collectivement stockés sous le nom $ Prefix..
$ NumberFormat = g 5 commutateur ($ NumberFormat) 0 $ Prefix = "($ (g 2) $ (g 10) $ (g 10)) $ (g 10) $ (g 10) $ (g 10)" 1 $ Prefix = "($ (g 10) 9 $ (g 10)) $ (g 10) $ (g 10) $ (g 10)" 2 $ Prefix = "($ (g 10) $ (g 10) $ (g 10)) $ (g 2) $ (g 10) $ (g 10) " 3 $ Prefix =" ($ (g 10) $ (g 10) $ (g 10)) $ (g 10) 11 " 4 $ Prefix =" ($ (g 10) $ (g 10) $ (g 10)) 555 "
La première ligne est une génération simple de nombres aléatoires permettant de choisir le format que nous allons suivre pour le numéro de téléphone. Ensuite, l'instruction switch prend ce choix au hasard et génère un préfixe $ en conséquence. Vous souvenez-vous de cette liste de types de numéros de téléphone invalides? Les valeurs $ NumberFormat 0-3 correspondent aux quatre premières de cette liste. La valeur 4 peut générer l’un des deux derniers, car les deux utilisent le code d’échange «555»..
Ici, vous pouvez également voir que nous utilisons une autre astuce avec des guillemets doubles. Les guillemets doubles ne vous permettent pas seulement d'interpréter les variables avant qu'une chaîne ne soit générée - ils vous permettent également de traiter des blocs de script. Pour ce faire, vous enroulez le bloc de script comme suit: "$ ()". Vous avez donc ci-dessus beaucoup de chiffres randomisés individuellement, dont certains sont soit limités dans leur plage, soit définis de manière statique en fonction des règles à respecter. Chaque chaîne comporte également une parenthèse et un espacement comme vous le souhaiteriez normalement dans une paire d'indicatif régional et d'indicatif régional.
La dernière chose que nous devons faire avant de pouvoir publier notre nom et notre numéro de téléphone est de générer un identifiant d'abonné, qui sera stocké sous le suffixe $..
switch ($ NumberFormat) $ _ -lt 4 $ Suffix = "$ (g 10) $ (g 10) $ (g 10) $ (g 10)" 4 switch ($ Préfixe) '( 800) 555 '$ Suffix =' 0199 ' défaut $ Suffix = "01 $ (g 10) $ (g 10)"
En raison des règles spéciales applicables aux 555 numéros, nous ne pouvons pas simplement générer quatre chiffres aléatoires pour la fin de chaque numéro de téléphone défini par notre script. Ainsi, le premier commutateur vérifie si nous avons affaire à un numéro 555. Sinon, il génère quatre chiffres aléatoires. S'il s'agit d'un numéro 555, le deuxième commutateur recherche l'indicatif régional 800. Si cela correspond, il n'y a qu'un seul suffixe valide que nous pouvons utiliser. Sinon, il est permis de choisir parmi n'importe quoi entre 0100-0199.
Notez qu'il y a plusieurs façons dont ce bloc aurait pu être écrit, au lieu de ce qu'il est. Les deux instructions switch auraient pu être remplacées par des instructions if / else, puisqu'elles ne traitent chacune que deux choix. De plus, au lieu d'appeler spécifiquement «4» comme option pour la première instruction switch, «default» aurait pu être utilisé de la même manière que dans la seconde puisqu'il s'agissait de la seule option disponible. Le choix entre if / else et switch, ou où utiliser le mot clé par défaut au lieu de valeurs spécifiques, revient souvent à une question de préférence personnelle. Tant que cela fonctionne, utilisez celui avec lequel vous êtes le plus à l'aise.
Maintenant, il est temps de sortir.
Write-Output "$ Prénom $ Nom de famille $ Préfixe- $ Suffixe"
Celui-ci est aussi simple que possible dans le script. Il affiche simplement le nom et le prénom séparés par des espaces, puis un autre espace avant le numéro de téléphone. Voici où le tiret standard entre code Exchange et ID d’abonné est également ajouté..
Ce crochet de fermeture en bas est la fin de la boucle ForEach-Object de précédemment - omettez ceci si vous l'avez déjà..
Partie 5: Nettoyer et exécuter le script
Une fois tout le travail terminé, un bon script sait comment se nettoyer. Encore une fois, la suppression de variable ci-dessous n'est pas vraiment nécessaire si vous n'exécutez le script qu'à partir de la console, mais vous le souhaiterez si vous envisagez de l'exécuter dans ISE..
Alias Remove-Item: \ g Remove-Variable ScriptFolder, RequiredFiles, Nom, Homme, Prénom, NumberFormat, Préfixe, Suffixe, ValidInput, UserInput
Une fois que tout est terminé, enregistrez le script avec une extension «.ps1» dans le même dossier que vos fichiers de noms. Assurez-vous que votre ExecutionPolicy est configurée de manière à ce que le script puisse s’exécuter,.
Voici une capture d'écran du script en action:
Vous pouvez également télécharger un fichier ZIP contenant ce script PowerShell et des fichiers texte avec des listes de noms, à partir du lien ci-dessous..
Nom aléatoire et générateur de numéros de téléphone pour PowerShell