10Sep
Lorsque vous avez besoin d'un ensemble de données pour le test ou la démonstration et que cet ensemble doit représenter des informations personnelles identifiables( PII), 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 vous pouvez utiliser PowerShell pour générer une liste de noms aléatoires et de numéros de téléphone pour une telle occasion.
Ce dont vous avez besoin
Avant de commencer, voici quelques outils et informations dont vous devriez disposer:
PowerShell
Ce script a été développé à l'aide de PowerShell 4.0 et a également été testé pour la compatibilité avec PowerShell 2.0.PowerShell 2.0 ou version ultérieure a été 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 sous XP SP2 ou version ultérieure, ou Vista sans SP1.
- PowerShell 4.0 est livré avec Windows 8.1.Les utilisateurs de Windows 7 SP1 peuvent effectuer cette mise à niveau dans le cadre d'une mise à jour WMF à partir du Centre de téléchargement Microsoft. Ce n'est pas disponible pour XP ou Vista.
Noms
Vous aurez besoin de quelques listes de noms pour alimenter le générateur aléatoire. Une grande source pour un lot de noms, et des informations concernant leur popularité( bien que ce 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 pourriez donc vouloir les réduire un peu si vous prévoyez générer beaucoup de noms et de nombres à la fois. Sur notre système de test, chaque paire nom / numéro a pris environ 1,5 secondes à générer en utilisant les listes complètes, mais votre kilométrage variera en fonction des spécifications de votre système.
- Noms de famille
- Prénoms
- Prénoms féminins
Indépendamment de la source que vous utilisez, vous devez générer trois fichiers texte que le script peut utiliser comme pools pour la sélection de son nom. Chaque fichier doit contenir uniquement des noms et un seul nom par ligne. Ceux-ci doivent être stockés dans le même dossier que votre script PowerShell.
Noms de famille.txt doit contenir les noms de famille que vous voulez que le script sélectionne. Exemple:
Smith Jones Williams JonesMales.txt doit contenir les prénoms masculins dont vous voulez que le script sélectionne. Exemple:
James John Robert Michael WilliamFemales.txt doit contenir les prénoms féminins dont vous voulez que le script sélectionne. Exemple:
Mary Patricia Linda Barbara ElizabethRègles pour les numéros de téléphone
Si vous voulez être sûr que vos numéros de téléphone ne correspondent pas au vrai numéro de téléphone de quelqu'un, le plus simple est d'utiliser le célèbre code "555".Mais si vous allez montrer un ensemble de données avec beaucoup de numéros de téléphone, ce 555 commencera à paraître assez monotone très rapidement. 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).Voici quelques exemples de numéros de téléphone invalides, représentant chaque classe de numéro qui sera générée par ce script:
- ( 157) 836-8167
Ce numéro est invalide parce que les codes de zone ne peuvent pas commencer par 1 ou 0. - ( 298) 731-6185
Ce numéro est invalide parce que le NANP n'attribue pas de codes de zone avec 9 comme second 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 est invalide car les codes d'échange ne peuvent pas se terminer par deux 1. - ( 265) 555-0128
Ce numéro est invalide parce que le code d'échange est 555, et l'ID d'abonné se trouve dans la plage réservée aux nombres fictifs. - ( 800) 555-0199
Ce numéro est le seul numéro 800 avec un code 555 Exchange qui est réservé pour être utilisé comme un nombre fictif.
Notez que les règles ci-dessus sont sujettes à changement et peuvent varier selon la juridiction. Vous devriez faire vos propres recherches pour vérifier les règles actuelles qui s'appliquent 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 courantes qui vont être utilisées tout au long de ce script, donc vous devriez avoir une idée de base de ce que cela signifie avant de plonger dans l'écriture.
- ForEach-Object 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 désigner l'élément en cours de traitement.
- if. .. else Les instructions vous permettent d'effectuer une opération uniquement si certaines conditions sont remplies et( facultativement) spécifiez ce qui doit être fait lorsque cette condition n'est pas remplie. Commutateur
- Les instructions sont comme si les instructions avec plus de choix. Switch vérifie un objet dans plusieurs conditions et exécute les blocs de script spécifiés pour les conditions correspondant à l'objet. Vous pouvez également, en option, spécifier un bloc par défaut qui ne s'exécutera que si aucune autre condition n'est trouvée. Les instructions switch utilisent également la variable $ _ pour désigner l'élément en cours de traitement.
- tandis que les instructions vous permettent de répéter en continu un bloc de script tant qu'une certaine condition est remplie. Une fois que quelque chose se produit et que la condition n'est plus vraie lorsque le bloc de script est terminé, la boucle se termine.
- try. .. catch Les instructions aident à gérer les erreurs. Si quelque chose ne va pas avec le bloc de script spécifié pour try, le bloc catch sera exécuté.
- Get-Content fait ce qu'il dit sur l'étain. Il obtient 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 pour être utilisé avec d'autres commandes.
- Write-Host place des éléments 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.
- Write-Output génère réellement une sortie. Normalement, ceci est sauvegardé 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 aimez que votre script démarre à partir d'une console propre, voici la première ligne que vous voulez.
Clear-HostMaintenant que nous avons un écran propre, la prochaine chose que nous voulons faire est de vérifier le script pour s'assurer que tout ce dont il a besoin est en place. Pour ce faire, nous devons commencer par dire où chercher et quoi chercher.
$ ScriptFolder = Chemin_partage $ MyInvocation. MyCommand. Definition -Parent $ RequiredFiles =( 'Males.txt', 'Females.txt', 'Names.txt')La première ligne est très utile pour n'importe quel script. Il définit une variable qui pointe vers le dossier contenant le script. Ceci est essentiel si votre script a besoin d'autres fichiers situés dans le même répertoire que lui-même( ou un chemin relatif connu de ce répertoire), sinon vous rencontrerez des erreurs si et quand vous essayez d'exécuter le script pendant que vous êtes dans un autredirecteur de travail.
La deuxième ligne crée un tableau de noms de fichiers requis pour que le script s'exécute correctement. Nous utiliserons ceci, avec la variable $ ScriptFolder, dans la partie suivante où nous vérifions que ces fichiers sont présents.
$ RequiredFiles |ForEach-Object{ if( !( Chemin de test "$ 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 est celui auquel il appartient. Test-Path est une commande simple qui, lorsqu'elle reçoit un chemin de fichier, 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 est un opérateur et non , qui inverse la réponse de Test-Path avant de la transmettre à l'instruction if. Donc, si Test-Path retourne false( c'est-à-dire que le fichier que nous recherchons n'existe pas), il sera converti en vrai pour que l'instruction if puisse exécuter son bloc de script.
Une autre chose à noter ici, qui sera souvent utilisée dans ce script, est l'utilisation de guillemets au lieu de guillemets simples. Lorsque vous placez quelque chose dans des guillemets simples, PowerShell le traite comme une chaîne statique. Tout ce qui est dans les guillemets simples sera transmis exactement tel quel. Les guillemets doubles indiquent à PowerShell de traduire les variables et quelques autres éléments spéciaux dans la chaîne avant de la transmettre. Ici, les guillemets doubles signifient qu'au lieu d'exécuter Test-Path '$ ScriptFolder \ $ _' , nous allons faire quelque chose de plus comme Test-Path 'C: \ Scripts \ Nom de famille. ( en supposant que votrescript est dans C: \ Scripts, et ForEach-Object travaille actuellement sur 'Names.txt').
Pour chaque fichier non trouvé, Write-Host affichera un message d'erreur en rouge pour vous dire quel fichier est manquant. Ensuite, il incrémente la variable $ MissingFiles qui sera utilisée dans le morceau suivant, à l'erreur et quitte s'il y avait des fichiers manquants.
if( $ MissingFiles){ Write-Host "Impossible de trouver le( s) fichier( s) source( s) de $ MissingFiles.-ForegroundColor Red Remove-Variable ScriptFolder, RequiredFiles, MissingFiles Quitter}Voici une autre astuce que vous pouvez faire avec les instructions if. La plupart des guides que vous verrez à propos des instructions vous dira d'utiliser un opérateur pour vérifier 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), cela n'est pas nécessaire. Vous pouvez également vous en passer dans des cas comme celui-ci, lorsque vous testez simplement pour voir si un nombre est différent de zéro. Tout nombre non nul( positif ou négatif) est considéré comme vrai, tandis que zéro( ou, comme cela peut arriver ici, une variable inexistante) sera traité comme faux.
Si $ MissingFiles existe et n'est pas égal à zéro, Write-Host affichera un message vous indiquant le nombre de fichiers manquants et l'abandon du script. Remove-Variable nettoiera toutes les variables que nous avons créées et quittera le script. Sur la console PowerShell standard, Remove-Variable n'est pas vraiment nécessaire pour ce but particulier car les variables définies par les scripts sont normalement ignorées lorsque le script se termine. Cependant, l'ISE PowerShell se comporte un peu différemment, donc vous pouvez le conserver si vous envisagez d'exécuter le script à partir de là.
Si tout est en ordre, le script continuera. Une préparation de plus à faire est un alias que nous serons très heureux d'avoir plus tard.
Nouvel alias g Les alias Get-Randomsont utilisés pour créer des noms alternatifs pour les commandes. Ceux-ci peuvent être utiles pour nous aider à nous familiariser avec la nouvelle interface( par exemple: PowerShell a des alias intégrés comme dir - Get-ChildItem et cat - & gt; Get - Content ) ou pour faire des raccourcispour les commandes couramment utilisées. Ici, nous faisons une très à court terme pour la commande Get-Random qui sera utilisée 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 dans le tableau et le crache. 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-Aléatoire 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 des nombres.-Random se comporte plus comme vous l'attendriez naturellement, mais nous n'en aurons pas besoin dans ce script.
Partie 2: Obtenir l'entrée de l'utilisateur et se rendre au travail
Alors qu'un script qui génère un seul nom aléatoire &le numéro de téléphone est super, c'est beaucoup mieux si le script permet à l'utilisateur de spécifier combien de noms &numéros qu'ils veulent obtenir dans un lot. Malheureusement, nous ne pouvons pas vraiment faire confiance aux utilisateurs pour toujours donner des commentaires valides. Donc, il y a un petit peu plus à cela que juste $ UserInput = Read-Host .
while( ! $ ValidInput){ try{ [int] $ UtilisateurInput = Read-Host -Prompt 'Éléments à générer' $ ValidInput = $ true} catch{ Écriture de l'hôte 'Entrée invalide. Entrez un numéro seulement. '-ForegroundColor Red}}L'instruction while ci-dessus vérifie et annule la valeur de $ ValidInput. Tant que $ ValidInput est faux ou n'existe pas, il continuera à boucler son bloc de script.
L'instruction try prend l'entrée de l'utilisateur, via Read-Host, et tente de la convertir en une valeur entière.(C'est le [int] avant Read-Host.) Si cela réussit, il va mettre $ ValidInput à true pour que la boucle while puisse sortir. En cas d'échec, le bloc catch affiche une erreur et, comme $ ValidInput n'a pas été défini, la boucle while reviendra et invitera à nouveau l'utilisateur.
Une fois que l'utilisateur a correctement entré un nombre en entrée, nous voulons que le script annonce qu'il est sur le point de commencer à faire son travail et ensuite de le faire.
Write-Host "` nGénérer des noms et des numéros de téléphone $ UserInput. S'il vous plaît soyez patient.`n "1. . $ UserInput |ForEach-Object{ & lt; # INSÉRER NOM ALÉATOIRE &NUMÉRO GÉNÉRATRICE ICI # & gt;}Ne vous inquiétez pas, nous n'allons pas vous laisser seul pour comprendre le nom aléatoire &code du générateur de nombres. C'est juste un commentaire d'espace réservé pour vous montrer où la section suivante( où le vrai travail est fait) va s'adapter.
La ligne Write-Host est assez simple. Il indique simplement combien de noms et de numéros de téléphone le script va générer, et demande à l'utilisateur d'être patient pendant que le script fait son travail. L' `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 séparation visuelle entre la ligne d'entrée et la liste des noms &Nombres. Sachez que c'est un back-tick( AKA "accent grave" - généralement l'onglet clé ci-dessus, à gauche de 1) et pas une apostrophe ou une seule citation devant chaque n .
La partie suivante montre une manière différente d'utiliser une boucle ForEach-Object. Généralement, lorsque vous voulez qu'un bloc de script s'exécute un certain nombre de fois, vous devez configurer une boucle régulière comme pour( $ x = 1; $ x -le $ UserInput; $ x ++){ & lt; # INSÉRER SCRIPTICI # & gt;}. ForEach-Object nous permet de simplifier cela en lui fournissant une liste d'entiers et, au lieu de lui dire de faire quoi que ce soit avec ces entiers, nous lui donnons juste un bloc de script statique à exécuter jusqu'à ce qu'il manque d'entiers pour le faire.
Partie 3: Génération d'un nom aléatoire
La génération du nom est le bit le plus simple du reste de ce processus. Il ne comprend que trois étapes: choisir un nom de famille, choisir un sexe et choisir un prénom. Rappelez-vous cet alias que nous avons fait pour Get-Random un certain temps en arrière? Il est temps de commencer à utiliser ça.
$ Nom = Get-Content "$ ScriptFolder \ Names.txt" |g $ Mâle = g 2 if( $ Homme){ $ Prénom = Get-Content "$ ScriptFolder \ Males.txt" |g} else{ $ FirstName = Obtenir-Contenu "$ ScriptFolder \ Females.txt" |g}La première ligne prend notre liste de noms, la place dans le sélecteur aléatoire et assigne le nom choisi à $ Nom.
La deuxième ligne choisit le genre 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 ainsi que nous utilisons Get-Random 2 ( ou l' beaucoup plus court grâce à notre alias - les deux ont pour résultat un choix entre zéro ou un) pour décider si notre personne est un homme ou non. L'instruction 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. Auparavant, nous vous avons montré comment vous pouvez créer un numéro de téléphone invalide ou fictif de plusieurs façons. Puisque nous ne voulons pas que tous nos numéros se ressemblent, nous choisirons au hasard un format numérique 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 préfixe $.
$ NumberFormat = g 5 commutateur( $ NumberFormat){ 0{ $ Préfixe = "($( g 2) $( g 10) $( g 10)) $( g 10) $( g 10) $( g 10)"} 1{ $ Préfixe ="( $( g 10) 9 $( g 10)) $( g 10) $( g 10) $( g 10) "} 2{ $ Préfixe ="( $( g 10)$( g 10) $( g 10)) $( g 2) $( g 10) $( g 10) "} 3{ $ Préfixe ="( $( g 10) $( g 10) $( g 10)$( g 10) 11 "} 4{ $ Préfixe ="( $( g 10) $( g 10) $( g 10)) 555 "}}La première ligne est une génération directe de nombres aléatoires pour choisir quel formatnous allons suivre pour le numéro de téléphone. Ensuite, l'instruction switch prend ce choix aléatoire et génère un préfixe $ en conséquence. Rappelez-vous cette liste de types de numéros de téléphone invalides? Les valeurs $ NumberFormat 0-3 correspondent aux quatre premiers de cette liste. La valeur 4 peut générer l'un des deux derniers, puisque les deux utilisent le code d'échange "555".
Ici, vous pouvez également voir que nous utilisons une autre astuce avec des guillemets. Les guillemets doubles ne vous permettent pas seulement d'interpréter les variables avant qu'une chaîne ne soit sortie, elles vous permettent également de traiter les blocs de script. Pour ce faire, vous enveloppez le bloc de script comme suit: "$( & lt; #SCRIPT HERE # & gt;)" .Donc, ce que vous avez ci-dessus est beaucoup de chiffres aléatoires individuels, avec certains d'entre eux soit limité dans leur gamme ou fixé de manière statique en fonction des règles que nous devons suivre. Chaque chaîne a également des parenthèses et des espaces comme vous le feriez normalement dans une paire Code régional et Code Exchange.
La dernière chose que nous devons faire avant que nous soyons prêts à sortir notre nom &Le numéro de téléphone est de générer un identifiant d'abonné, qui sera stocké en suffixe $.Commutateur
( $ NumberFormat){ $ $ -lt 4}{ $ Suffixe = "$( g 10) $( g 10) $( g 10) $( g 10)"} 4{ commutateur( $ Préfixe){ '(800) 555 '{$ Suffix =' 0199 '} par défaut{ $ Suffixe = "01 $( g 10) $( g 10)"}}}}En raison des règles spéciales pour les numéros 555, nous ne pouvons pas simplementgénérer quatre chiffres aléatoires pour la fin de chaque numéro de téléphone que notre script va faire. 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 second commutateur vérifie 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 entre 0100-0199.
Notez qu'il y a plusieurs façons d'écrire ce bloc, plutôt que comme il est. Les deux instructions switch pourraient avoir été remplacées par des instructions if / else, puisqu'elles ne gèrent 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 façon que dans la seconde, puisqu'il s'agissait de la seule option restante. Le choix entre if / else et switch, ou l'endroit où utiliser le mot-clé par défaut plutôt que des valeurs spécifiques, revient souvent à une question de préférence personnelle. Tant que cela fonctionne, utilisez ce que vous êtes le plus à l'aise.
Maintenant, il est temps pour la sortie.
Write-Output "$ Prénom $ Nom $ Préfixe- $ Suffixe"}Celui-ci est à peu près aussi simple que dans le script. Il sort juste le prénom et le nom séparés par des espaces, puis un autre espace avant le numéro de téléphone. Voici où le tableau de bord standard entre le code Exchange et l'ID de l'abonné est également ajouté.
Cette parenthèse fermante en bas est la fin de la boucle ForEach-Object précédente - omettez ceci si vous l'avez déjà.
Partie 5: Nettoyage et exécution du script
Après tout le travail est fait, un bon script sait comment nettoyer après lui-même. Encore une fois, la suppression de variable ci-dessous n'est pas vraiment nécessaire si vous ne faites que lancer le script depuis la console, mais vous le voudrez si vous envisagez de l'exécuter dans l'ISE.
Elément Remove-Item: \ g Remove-Variable ScriptFolder, RequiredFiles, Nom, Mâle, Prénom, NumberFormat, Préfixe, Suffixe, ValidInput, UserInputUne fois que tout est terminé, enregistrez le script avec l'extension ".ps1"dans le même dossier que vos fichiers de noms. Assurez-vous que votre ExecutionPolicy est définie de sorte que le script puisse s'exécuter et que vous le projetiez.
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 au hasard &Générateur de numéro de téléphone pour PowerShell