Hoe willekeurige namen en telefoonnummers te genereren met PowerShell
Wanneer u een dataset nodig hebt voor testen of demonstratie en die set moet persoonlijk identificeerbare informatie (PII) vertegenwoordigen, wilt u over het algemeen geen echte gegevens gebruiken die echte mensen vertegenwoordigen. Hier zullen we u laten zien hoe u PowerShell kunt gebruiken om een lijst met willekeurige namen en telefoonnummers te genereren voor precies zo'n gelegenheid.
Wat je nodig hebt
Voordat u begint, zijn er enkele hulpmiddelen en informatie die u moet hebben:
PowerShell
Dit script is ontwikkeld met PowerShell 4.0 en is ook getest op compatibiliteit met PowerShell 2.0. PowerShell 2.0 of hoger is ingebouwd in Windows sinds Windows 7. Het is ook beschikbaar voor Windows XP en Vista als onderdeel van het Windows Management Framework (WMF). Hieronder vindt u enkele verdere details en links voor downloads.
- PowerShell 2.0 wordt geleverd met Windows 7. Gebruikers van Windows XP SP3 en Vista (SP1 of later) kunnen de juiste WMF-versie downloaden van Microsoft in KB968929. Het wordt niet ondersteund op XP SP2 of lager, of Vista zonder SP1.
- PowerShell 4.0 wordt geleverd met Windows 8.1. Windows 7 SP1-gebruikers kunnen hiernaar upgraden als onderdeel van een WMF-update van het Microsoft Downloadcentrum. Het is niet beschikbaar voor XP of Vista.
namen
Je hebt een aantal namenlijsten nodig om in de willekeurige generator te worden ingevoerd. Een geweldige bron voor een lot van namen en informatie over hun populariteit (hoewel dat niet zal worden gebruikt voor dit script), is het Census Bureau van de Verenigde Staten. De lijsten die beschikbaar zijn op de onderstaande links zijn erg groot, dus misschien wilt u ze een beetje inkorten als u van plan bent veel namen en nummers tegelijkertijd te genereren. Op ons testsysteem nam elk naam / nummer-paar ongeveer 1,5 seconden in beslag om te genereren met behulp van de volledige lijsten, maar uw kilometerstand zal variëren, afhankelijk van uw eigen systeemspecificaties.
- familienamen
- Voornamen mannelijk
- Vrouwelijke voornamen
Ongeacht de bron die u gebruikt, moet u drie tekstbestanden genereren die het script als pools voor de naamselectie kan gebruiken. Elk bestand moet alleen namen bevatten en slechts één naam per regel. Deze moeten worden opgeslagen in dezelfde map als uw PowerShell-script.
Surnames.txt moet de achternamen bevatten waarvan u het script wilt selecteren. Voorbeeld:
Smith Johnson Williams Jones Brown
Males.txt moet de mannelijke voornamen bevatten waarvan u het script wilt selecteren. Voorbeeld:
James John Robert Michael William
Females.txt zou de vrouwelijke voornaam moeten bevatten waarvan u het script wilt selecteren. Voorbeeld:
Mary Patricia Linda Barbara Elizabeth
Regels voor telefoonnummers
Als u zeker wilt weten dat uw telefoonnummers niet overeenkomen met iemands echte telefoonnummer, is de eenvoudigste manier om de bekende "555" Exchange-code te gebruiken. Maar als je een dataset met veel telefoonnummers gaat vertonen, zal die 555 er behoorlijk monotoon en snel uitzien. Om dingen interessanter te maken, zullen we andere telefoonnummers genereren die de regels van het North American Numbering Plan (NANP) overtreden. Hieronder staan een paar voorbeeld ongeldige telefoonnummers, die elke klasse van nummers vertegenwoordigen die door dit script worden gegenereerd:
- (157) 836-8167
Dit nummer is ongeldig omdat gebiedcodes niet met een 1 of 0 kunnen beginnen. - (298) 731-6185
Dit nummer is ongeldig omdat de NANP geen netnummers toewijst met 9 als het tweede cijfer. - (678) 035-7598
Dit nummer is ongeldig omdat Exchange Codes niet met een 1 of 0 kunnen beginnen. - (752) 811-1375
Dit nummer is ongeldig omdat Exchange Codes niet kunnen eindigen met twee 1-en. - (265) 555-0128
Dit nummer is ongeldig omdat de Exchange-code 555 is, en de abonnee-ID valt binnen het bereik dat is gereserveerd voor fictieve getallen. - (800) 555-0199
Dit nummer is het enige 800-nummer met een 555 Exchange-code die is gereserveerd voor gebruik als een fictief nummer.
Houd er rekening mee dat de bovenstaande regels kunnen worden gewijzigd en kunnen verschillen per jurisdictie. Je moet je eigen onderzoek doen om de huidige regels te verifiëren die van toepassing zijn op de locale waarvoor je telefoonnummers genereert.
Gemeenschappelijke commando's
Er zijn enkele redelijk veel voorkomende commando's die in dit script worden gebruikt, dus je zou een idee moeten krijgen van wat deze betekenen voordat we erover beginnen om het echt te schrijven.
- ForEach-Object neemt een array of lijst met objecten en voert de gespecificeerde bewerking uit op elk van deze objecten. In een ForEach-Object-scriptblok wordt de variabele $ _ gebruikt om te verwijzen naar het huidige item dat wordt verwerkt.
- als ... anders Met instructies kunt u een bewerking alleen uitvoeren als aan bepaalde voorwaarden is voldaan en (optioneel) opgeven wat moet worden gedaan wanneer aan die voorwaarde niet wordt voldaan.
- schakelaar uitspraken lijken op uitspraken met meer keuzes. Schakelen controleert een object op verschillende voorwaarden en voert de scriptblokken uit die zijn opgegeven voor voorwaarden die overeenkomen met het object. U kunt ook een standaardblok opgeven dat alleen wordt uitgevoerd als er geen andere voorwaarden zijn gekoppeld. Schakelinstructies gebruiken ook de variabele $ _ om te verwijzen naar het huidige item dat wordt verwerkt.
- terwijl Met opdrachten kunt u een scriptblok continu herhalen zolang aan een bepaalde voorwaarde is voldaan. Zodra er iets gebeurt waardoor de voorwaarde niet langer waar is wanneer het scriptblok is voltooid, wordt de lus afgesloten.
- proberen te vangen instructies helpen bij het afhandelen van fouten. Als er iets misgaat met het scriptblok dat is opgegeven voor try, wordt het blok catch uitgevoerd.
- Inhoud krijgen doet wat het zegt op het blik. Het krijgt de inhoud van een opgegeven object - meestal een bestand. Dit kan worden gebruikt om de inhoud van een tekstbestand op de console weer te geven of, zoals in dit script, de inhoud langs de pijplijn door te geven voor gebruik met andere opdrachten.
- Write-Host stopt dingen in de console. Dit wordt gebruikt om berichten aan de gebruiker te presenteren en wordt niet opgenomen in de uitvoer van het script als de uitvoer wordt omgeleid.
- Write-Output eigenlijk produceert output. Normaal gesproken wordt dit naar de console gedumpt, maar het kan ook worden omgeleid door andere opdrachten.
Er zijn nog andere commando's in het script, maar we leggen die uit wanneer we gaan.
Het script bouwen
Nu is het tijd om onze handen vuil te maken.
Deel 1: Klaar om te gaan
Als u wilt dat uw script wordt gestart vanuit een schone console, dan is hier de eerste regel die u wilt.
Clear-Host
Nu we een schoon scherm hebben, is het volgende dat we willen doen, dat het script controleert of alles wat het nodig heeft op zijn plaats is. Om dat te doen, moeten we beginnen met te vertellen waar te zoeken en waar we naar moeten zoeken.
$ ScriptFolder = Split-pad $ MyInvocation.MyCommand.Definition -Parent $ RequiredFiles = ('Males.txt', 'Females.txt', 'Achternamen.txt')
De eerste regel is erg handig voor elk script. Het definieert een variabele die verwijst naar de map die het script bevat. Dit is essentieel als je script andere bestanden nodig heeft die zich in dezelfde map bevinden als zichzelf (of een bekend relatief pad uit die map), omdat je anders fouten tegenkomt als en wanneer je het script probeert uit te voeren terwijl je in een andere map bent werkmap.
De tweede regel maakt een reeks bestandsnamen die nodig zijn om het script correct te laten werken. We gebruiken dit, samen met de variabele $ ScriptFolder, in het volgende gedeelte, waar we controleren of die bestanden aanwezig zijn.
$ RequiredFiles | ForEach-Object if (! (Test-pad "$ ScriptFolder \ $ _")) Write-Host "$ _ niet gevonden." -ForegroundColor Red $ MissingFiles ++
Dit blok script verzendt de array $ RequiredFiles naar een ForEach-Object-blok. Binnen dat scriptblok gebruikt de if-opdracht Testpad om te zien of het bestand waarnaar we zoeken, is waar het thuishoort. Testpad is een eenvoudige opdracht die, wanneer een bestandspad wordt gegeven, een standaard waar of onwaar antwoord retourneert om ons te laten weten of het pad naar iets dat bestaat, verwijst. Het uitroepteken daarbinnen is a niet operator, die de reactie van Test-Path omkeert voordat deze wordt doorgegeven aan de if-instructie. Dus als Test-pad false retourneert (dat wil zeggen, het bestand waarnaar we op zoek zijn niet bestaat), wordt het geconverteerd naar true, zodat de if-instructie het scriptblok uitvoert.
Een ander ding om hier op te merken, dat vaak in dit script zal worden gebruikt, is het gebruik van dubbele aanhalingstekens in plaats van enkele aanhalingstekens. Wanneer u iets in enkele aanhalingstekens plaatst, beschouwt PowerShell dit als een statische tekenreeks. Wat in de enkele aanhalingstekens staat, wordt precies zoals ze is doorgegeven. Met dubbele aanhalingstekens geeft PowerShell aan dat de variabelen en enkele andere speciale items in de tekenreeks moeten worden omgezet voordat deze worden doorgegeven. Hier betekenen de dubbele aanhalingstekens dat in plaats van lopen Testpad '$ ScriptFolder \ $ _' we zullen eigenlijk iets meer doen zoals Testpad 'C: \ Scripts \ Achternamen.txt' (ervan uitgaande dat uw script in C: \ Scripts staat en ForEach-Object werkt momenteel aan 'Achternamen.txt').
Voor elk niet gevonden bestand zal Write-Host een foutmelding in rood plaatsen om aan te geven welk bestand ontbreekt. Vervolgens wordt de variabele $ MissingFiles verhoogd die in het volgende stuk wordt gebruikt, naar fout en stopt als er bestanden ontbreken.
if ($ MissingFiles) Write-Host "Kon $ MissingFiles-bronbestand (en) niet vinden. Afbreken van script." -ForegroundColor Red Remove-Variable ScriptFolder, RequiredFiles, MissingFiles Exit
Hier is nog een leuke truc die je kunt doen met if-statements. De meeste handleidingen die u zult zien als verklaringen u vertellen om een operator te gebruiken om te controleren op een passende voorwaarde. Hier zouden we bijvoorbeeld kunnen gebruiken if ($ MissingFiles -gt 0) om te zien of $ MissingFiles groter is dan nul. Als u echter al opdrachten gebruikt die een Booleaanse waarde retourneren (zoals in het vorige blok waar we Testpad gebruikten), is dat niet nodig. Je kunt ook zonder doen in gevallen als deze, als je alleen maar test om te zien of een getal niet nul is. Elk niet-nul getal (positief of negatief) wordt behandeld als waar, terwijl nul (of, zoals hier kan gebeuren, een niet-bestaande variabele) als onjuist wordt behandeld.
Als $ MissingFiles bestaat en niet-nul is, zal Write-Host een bericht plaatsen waarin staat hoeveel bestanden ontbreken en dat het script zal worden afgebroken. Vervolgens zal Remove-Variable alle variabelen opschonen die we hebben gemaakt en Exit zal het script afsluiten. In de normale PowerShell-console is Remove-Variable niet echt nodig voor dit specifieke doel, omdat variabelen die zijn ingesteld door scripts normaal worden verwijderd wanneer het script wordt afgesloten. De PowerShell ISE gedraagt zich echter een beetje anders, dus u wilt dit misschien behouden als u van plan bent het script vanaf daar te laten draaien.
Als alle dingen in orde zijn, gaat het script verder. Nog een voorbereiding is een alias die we later graag willen hebben.
Nieuw-alias g Get-Random
Aliassen worden gebruikt om alternatieve namen voor opdrachten te maken. Deze kunnen handig zijn om ons te helpen kennis te maken met de nieuwe interface (bijvoorbeeld: PowerShell heeft ingebouwde aliassen zoals dir -> Get-ChildItem en kat -> Get-Content) of om korte-handsreferenties te maken voor veelgebruikte opdrachten. Hier maken we een heel korte referentie voor de Get-Random commando dat veel later zal worden gebruikt.
Get-Random doet zowat wat de naam doet vermoeden. Gegeven een array (zoals een lijst met namen) als invoer, kiest het een willekeurig item uit de array en spuugt het uit. Het kan ook worden gebruikt om willekeurige getallen te genereren. Het ding om te onthouden over Get-Random en nummers is echter dat, net als veel andere computerbewerkingen, het vanaf nul begint te tellen. Dus in plaats van Get-Random 10 wat betekent dat het natuurlijker is "geef me een cijfer van 1 tot 10", het betekent echt "geef me een cijfer van 0 tot 9". Je kunt meer specifiek zijn over de nummerselectie, zodat Get-Random zich meer gedraagt zoals je van nature zou doen verwachten, maar dat hebben we niet nodig in dit script.
Deel 2: Gebruikersinvoer ontvangen en aan de slag gaan
Hoewel een script dat slechts één willekeurige naam en telefoonnummer genereert geweldig is, is het veel beter als het script de gebruiker toestaat om te specificeren hoeveel namen en nummers ze in één batch willen krijgen. Helaas kunnen we gebruikers niet echt vertrouwen om altijd geldige informatie te geven. Dus hier is een klein beetje meer aan dan alleen $ UserInput = Read-Host.
while (! $ ValidInput) try [int] $ UserInput = Read-Host - Prompt 'Te genereren items' $ ValidInput = $ true catch Write-Host 'Ongeldige invoer. Voer alleen een cijfer in. ' -ForegroundColor Red
De bovenstaande while-instructie controleert of negeert de waarde van $ ValidInput. Zolang $ ValidInput niet waar is of niet bestaat, blijft het door het scriptblok heen lopen.
De try-instructie neemt gebruikersinvoer op via Read-Host en probeert deze te converteren naar een geheel-getalwaarde. (Dat is de [Int] vóór Read-Host.) Als het succesvol is, wordt $ ValidInput ingesteld op true, zodat de while-lus kan afsluiten. Als dit niet lukt, geeft het blok catch een foutmelding en omdat $ ValidInput niet is ingesteld, komt de while-lus terug en wordt de gebruiker opnieuw gevraagd.
Nadat de gebruiker een nummer correct als invoer heeft gegeven, willen we dat het script aankondigt dat het op het punt staat zijn werk daadwerkelijk te doen en het vervolgens gaat doen.
Schrijf-host "'Genereer $ UserInput namen en telefoonnummers. Wees geduldig." 1 ... $ UserInput | VoorElk-object
Maak je geen zorgen, we laten je niet alleen achter om de willekeurige naam en nummer generator code te achterhalen. Dat is slechts een opmerking van plaatshouder om u te laten zien waar het volgende gedeelte (waar het echte werk wordt uitgevoerd) zal passen.
De Write-Host-regel is vrij eenvoudig. Het geeft gewoon aan hoeveel namen en telefoonnummers het script gaat genereren en vraagt de gebruiker geduldig te zijn terwijl het script zijn werk doet. De'n aan het begin en aan het einde van de string is het invoegen van een lege regel voor en na die uitvoer, alleen om hem een visuele scheiding te geven tussen de invoerregel en de lijst met namen en nummers. Houd er rekening mee dat dit een terugslag is (AKA "ernstig accent" - meestal de sleutel hierboven tab, links van 1) en niet een apostrof of een enkel aanhalingsteken voor elk n.
Het volgende deel toont een andere manier waarop u een ForEach-Object-lus kunt gebruiken. Normaal gesproken, als u wilt dat een scriptblok een bepaald aantal keren wordt uitgevoerd, stelt u een normale lus in voor ($ x = 1; $ x -le $ UserInput; $ x ++) . ForEach-Object laat ons dit vereenvoudigen door het een lijst met gehele getallen toe te voegen en in plaats van te vertellen dat het werkelijk iets met die gehele getallen doet, geven we het gewoon een statisch scriptblok om uit te voeren totdat het geen gehele getallen heeft om het voor te doen.
Deel 3: Een willekeurige naam genereren
Het genereren van de naam is het eenvoudigste deel van de rest van dit proces. Het bestaat uit drie stappen: een achternaam kiezen, een geslacht kiezen en een voornaam kiezen. Weet je nog dat alias we een tijdje maakten voor Get-Random? Tijd om dat te gaan gebruiken.
$ Achternaam = Get-Content "$ ScriptFolder \ Achternamen.txt" | g $ Man = g 2 if ($ Male) $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" | g else $ FirstName = Get-Content "$ ScriptFolder \ Females.txt" | g
De eerste regel neemt onze lijst met achternamen, voert deze in de willekeurige kiezer in en wijst de gekozen naam toe aan $ Achternaam.
De tweede regel kiest het geslacht van onze persoon. Weet je nog hoe Get-Random begint te tellen vanaf nul, en hoe nul is fout en al het andere waar is? Dat is hoe we gebruiken Get-Random 2 (of de veel kortere g 2 dankzij ons alias - beide resulteren in een keuze tussen nul of één) om te beslissen of onze persoon een man is of niet. De if / else-instructie kiest achteraf willekeurig een mannelijke of vrouwelijke voornaam.
Deel 4: Een willekeurig telefoonnummer genereren
Dit is het leuke gedeelte. Eerder hebben we u laten zien hoe u op verschillende manieren een ongeldig of fictief telefoonnummer kunt invoeren. Omdat we niet willen dat al onze nummers er te veel op lijken, zullen we willekeurig een ongeldig getalformaat kiezen. De willekeurig gekozen indelingen worden bepaald door hun regiocode en ruilcode, die gezamenlijk worden opgeslagen als $ voorvoegsel.
$ 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 "
De eerste regel is een eenvoudige generatie van willekeurige getallen om te kiezen welk formaat we voor het telefoonnummer gaan gebruiken. Vervolgens neemt de switch-instructie die willekeurige keuze en genereert overeenkomstig een $ -voorvoegsel. Weet je nog die lijst met ongeldige telefoonnummers? De $ NumberFormat-waarden 0-3 komen overeen met de eerste vier in die lijst. Waarde 4 kan een van de laatste twee genereren, omdat beide de "555" Exchange-code gebruiken.
Hier kun je ook zien dat we een andere truc gebruiken met dubbele aanhalingstekens. Met dubbele aanhalingstekens kunt u niet alleen variabelen interpreteren voordat een tekenreeks wordt uitgevoerd, maar u kunt ook scriptblokken verwerken. Om dit te doen, wikkelt u het scriptblok als volgt in: “$ ()”. Dus wat je hierboven hebt, zijn veel individueel gerandomiseerde cijfers, waarvan sommige beperkt zijn in hun bereik of statisch zijn ingesteld volgens de regels die we moeten volgen. Elke reeks heeft ook haakjes en afstanden zoals u normaal zou verwachten in een landnummer en een valutacode.
Het laatste wat we moeten doen voordat we klaar zijn om onze naam en telefoonnummer uit te voeren, is om een abonnee-ID te genereren, die wordt opgeslagen als $ Suffix.
schakelen ($ NumberFormat) $ _ -lt 4 $ Suffix = "$ (g 10) $ (g 10) $ (g 10) $ (g 10)" 4 switch ($ Prefix) '( 800) 555 '$ Suffix =' 0199 ' standaard $ Suffix = "01 $ (g 10) $ (g 10)"
Vanwege de speciale regels voor 555-nummers kunnen we niet zomaar vier willekeurige cijfers genereren voor het einde van elk telefoonnummer dat ons script gaat maken. Dus, de eerste schakelaar controleert of we te maken hebben met een 555-nummer. Als dat niet het geval is, genereert het vier willekeurige cijfers. Als het een 555-nummer is, controleert de tweede switch het 800-netnummer. Als dat overeenkomt, is er maar één geldige $ achtervoegsel die we kunnen gebruiken. Anders is het toegestaan om iets te kiezen tussen 0100-0199.
Merk op dat er een paar verschillende manieren zijn waarop dit blok geschreven zou kunnen zijn, in plaats van zoals het is. Beide schakelinstructies kunnen zijn vervangen door if / else-instructies, omdat ze elk slechts twee keuzes afhandelen. Ook, in plaats van specifiek "4" uit te roepen als een optie voor de eerste switchinstructie, had "default" kunnen worden gebruikt zoals het in de tweede was gedaan, aangezien dit de enige overgebleven optie was. De keuze tussen if / else vs. switch of waar het standaard sleutelwoord moet worden gebruikt in plaats van specifieke waarden, komt vaak neer op een kwestie van persoonlijke voorkeur. Zolang het werkt, gebruik je waar je het meest comfortabel mee bent.
Nu is het tijd voor output.
Write-Output "$ Voornaam $ Achternaam $ Voorvoegsel- $ Achtervoegsel"
Deze is vrijwel net zo eenvoudig als in het script. Het voert gewoon de voor- en achternaam uit, gescheiden door spaties, en dan nog een spatie vóór het telefoonnummer. Hier wordt ook het standaardstreepje tussen Exchange-code en Abonnee-ID toegevoegd.
Die afsluitende haak onderaan is het einde van de ForEach-Object-loop van vroeger - laat dit weg als je het al hebt.
Deel 5: Opschonen en het script uitvoeren
Nadat al het werk is gedaan, weet een goed script hoe het zichzelf moet opruimen. Nogmaals, de onderstaande variabele verwijdering is niet echt nodig als je het script alleen vanuit de console wilt uitvoeren, maar je zult het willen als je ooit van plan bent om het in de ISE uit te voeren.
Remove-Item alias: \ g Remove-Variable ScriptFolder, RequiredFiles, Achternaam, Man, FirstName, NumberFormat, Prefix, Suffix, ValidInput, UserInput
Nadat u alles hebt gedaan, slaat u het script op met de extensie ".ps1" in dezelfde map als uw naambestanden. Zorg ervoor dat uw ExecutionPolicy zo is ingesteld dat het script kan worden uitgevoerd en geef het een werveling.
Hier is een screenshot van het script in actie:
Je kunt ook een ZIP-bestand downloaden met dit PowerShell-script en tekstbestanden met namenlijsten op de onderstaande link.
Random Name & Phone Number Generator voor PowerShell