Comment générer des noms et des numéros de téléphone aléatoires avec PowerShell

Table des matières:

Comment générer des noms et des numéros de téléphone aléatoires avec PowerShell
Comment générer des noms et des numéros de téléphone aléatoires avec PowerShell

Vidéo: Comment générer des noms et des numéros de téléphone aléatoires avec PowerShell

Vidéo: Comment générer des noms et des numéros de téléphone aléatoires avec PowerShell
Vidéo: ⭐GMAIL Les 10 meilleurs astuces (2022) - YouTube 2024, Avril
Anonim
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. 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.
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. 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 fourni 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 une 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 Bureau du recensement des États-Unis. 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, la génération de chaque paire nom / numéro a pris environ 1,5 seconde à l’aide des listes complètes, mais votre kilométrage variera 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 souhaitez 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 numéro de téléphone réel de qui que ce soit, le plus simple est d’utiliser le code d’échange «555» bien connu. Mais si vous voulez afficher un ensemble de données comportant de nombreux numéros de téléphone, ce 555 deviendra vite monotone. Pour rendre les choses plus intéressantes, nous générerons d’autres numéros de téléphone qui ne respectent pas les règles du plan de numérotation nord-américain (NANP). Vous trouverez ci-dessous quelques 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 1 ou 0.
  • (298) 731-6185 Ce numéro n'est pas valide 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 1 ou 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 est invalide car le code d'échange est le 555, et l'identifiant d'abonné se situe 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

Certaines commandes assez courantes vont être utilisées tout au long de ce script. Vous devriez donc avoir une idée de ce qu’elles signifient 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 (facultativement) de spécifier ce qui doit être fait 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 lorsque le bloc de script est terminé, 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 essayer, 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 également être redirigé par d'autres commandes.

Le script contient d’autres commandes, mais nous les expliquerons au fur et à mesure.

Construire le script

Il est maintenant temps de nous 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 y figurer.

Clear-Host

Maintenant que nous avons un écran vide, 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 dire 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 cela, 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 '$_ not found.' -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. Ainsi, si Test-Path renvoie false (c’est-à-dire que 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 de 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 comme Chemin de test '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, en erreur et se fermera s’il manquait des fichiers.

if ($MissingFiles) { Write-Host 'Could not find $MissingFiles source file(s). Aborting 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 la question de savoir si les instructions vous diront d’utiliser 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. Toutefois, si vous utilisez déjà des commandes renvoyant une valeur booléenne (comme dans le bloc précédent où nous utilisions Test-Path), cela n’est pas nécessaire. Vous pouvez également vous en passer dans des cas comme celui-ci, lorsque vous effectuez un test 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 utile 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 ultérieurement.

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 la 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 nous n’aurons pas besoin de cela dans ce script.

Partie 2: Obtenir les commentaires des utilisateurs et se mettre au travail

Même si un script qui ne génère qu'un nom et un numéro de téléphone au hasard est génial, 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 vraiment pas 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 'Items to be generated' $ValidInput = $true } catch { Write-Host 'Invalid input. Enter a number only.' -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 sera 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 souhaitons 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 names & phone numbers. Please be patient.`n' 1..$UserInput | ForEach-Object { <# INSERT RANDOM NAME & NUMBER GENERATOR HERE #> }

Ne vous inquiétez pas, nous ne vous laisserons pas choisir le code du générateur de noms et de numéros aléatoires. C’est juste un commentaire d’espace réservé pour vous montrer où va se trouver 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`nau début et à la fin de la chaîne, insérez une ligne vierge avant et après cette sortie, afin de 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» - habituellement 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 devez configurer une boucle for régulière comme for ($ x = 1; $ x -le $ UserInput; $ x ++) {<# INSERT SCRIPT HERE #>}.ForEach-Object nous permet de simplifier cela 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 fait pour Get-Random il y a quelque temps? Il est temps de commencer à utiliser cela.

$Surname = Get-Content '$ScriptFolderSurnames.txt' | g $Male = g 2 if ($Male) {$FirstName = Get-Content '$ScriptFolderMales.txt' | g} else {$FirstName = Get-Content '$ScriptFolderFemales.txt' | g}

La première ligne prend notre liste de noms de famille, l'insère dans le sélecteur aléatoire et attribue le nom choisi à $ Surname.

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 que nous utilisons Get-Random 2 (ou le beaucoup plus court g 2 grâce à notre pseudonyme - 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. Nous avons déjà montré comment vous pouvez créer un numéro de téléphone invalide ou fictif de différentes manières. Puisque 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 switch ($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 directe 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 les guillemets doubles. Les guillemets doubles ne vous permettent pas seulement d’interpréter les variables avant la sortie d’une chaîne, ils vous permettent également de traiter des blocs de script. Pour ce faire, vous enveloppez le bloc de script comme suit: “$ (<# SCRIPT ICI #>)”. 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 des parenthèses et un espacement comme vous vous y attendez normalement dans une paire d’indicatif régional et d’échange.

La dernière chose à 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 ($Prefix) { '(800) 555' {$Suffix = '0199'} default {$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’ya qu’un seul suffixe valide que nous pouvons utiliser. Sinon, il est permis de choisir 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 «4» en tant qu'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 l’utilisation du 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 la méthode avec laquelle vous êtes le plus à l’aise.

Maintenant, il est temps de sortir.

Write-Output '$FirstName $Surname $Prefix-$Suffix' }

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 le code Exchange et l’ID d’abonné est également ajouté.

La parenthèse de fermeture en bas est la fin de la boucle ForEach-Object d’avance. Oubliez cela 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 voulez seulement exécuter le script à partir de la console, mais vous en aurez besoin si vous envisagez de l’exécuter dans ISE.

Remove-Item alias:g Remove-Variable ScriptFolder,RequiredFiles,Surname,Male,FirstName,NumberFormat,Prefix,Suffix,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 être exécuté et testez-la.

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.
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

Conseillé: