10Sep
Wanneer u een dataset voor testen of demonstratie nodig hebt 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 u nodig hebt
Voordat u aan de slag gaat, zijn er enkele hulpprogramma's 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).Een aantal verdere details en koppelingen voor downloads staan hieronder.
- 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 upgraden naar het als onderdeel van een WMF-update van het Microsoft Downloadcentrum. Het is niet beschikbaar voor XP of Vista.
-namen
U hebt een aantal namenlijsten nodig om in de willekeurige generator te worden ingevoerd. Een geweldige bron voor een veel 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 paar naam / nummer 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.
- Achternamen
- Voornamen mannelijk
- Voornamen vrouwelijk
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.
Achternamen.txt moet de achternamen bevatten waarvoor u het script wilt selecteren. Voorbeeld:
Smith Johnson Williams Jones BrownMales.txt zou de mannelijke voornaam moeten bevatten waaruit u het script wilt selecteren. Voorbeeld:
James John Robert Michael WilliamFemales.txt zou de vrouwelijke voornaam moeten bevatten waaruit 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 in strijd zijn met de North American Numbering Plan( NANP) -regels. 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 kunnen beginnen met een 1 of 0. - ( 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 met twee enen kunnen eindigen. - ( 265) 555-0128
Dit nummer is ongeldig omdat de Exchange-code 555, en is. 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 onderhevig zijn aan wijzigingen 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 opdrachten
Er zijn enkele redelijk veel voorkomende commando's die in dit script gebruikt zullen worden, dus je zou een idee moeten krijgen van wat deze betekenen voordat we erover beginnen om het echt te schrijven.
- voor elk-object neemt een array of lijst van 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 u alleen een bewerking kunt uitvoeren als aan bepaalde voorwaarden is voldaan en( optioneel) kunt opgeven wat moet worden gedaan als niet aan die voorwaarde wordt voldaan.
- -switch -statements lijken op statements 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 -statements u toestaan om een scriptblok continu te 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.
- probeer. .. -instructies te helpen bij het afhandelen van fouten. Als er iets misgaat met het scriptblok dat is opgegeven voor try, wordt het blok catch uitgevoerd.
- Get-Content doet wat het zegt in het blik. Het krijgt de inhoud van een opgegeven object - meestal een bestand. Dit kan worden gebruikt om de inhoud van een tekstbestand weer te geven op de console of, zoals in dit script, de inhoud langs de pijplijn door te geven voor gebruik met andere opdrachten.
- Write-Host zet spullen 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 genereert daadwerkelijk 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 als we gaan.
Het script bouwen
Nu is het tijd om onze handen vuil te maken.
Deel 1: Voorbereidingen treffen om te gaan
Als u wilt dat uw script wordt gestart vanaf een schone console, dan is hier de eerste regel die u wilt.
Clear-HostNu 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 we moeten zoeken en waar we naar moeten zoeken.
$ ScriptFolder = Split-pad $ MyInvocation. MyCommand. Definition -Parent $ RequiredFiles =( 'Males.txt', 'Females.txt', 'Achternamen.txt')De eerste regel daar 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 directory 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 bentwerkmap.
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 deze bestanden aanwezig zijn.
$ Vereiste bestanden |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 daarin is een 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.
Nog een ding om 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 het 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 -testpad '$ ScriptFolder \ $ _' te gebruiken, we eigenlijk iets meer als -testpad 'C: \ Scripts \ Achternamen.txt' doen( ervan uitgaande dat uwscript staat in C: \ Scripts en ForEach-Object werkt momenteel aan 'Achternamen.txt').
Voor elk bestand dat niet wordt gevonden, zal Write-Host een foutmelding in rood plaatsen om aan te geven welk bestand ontbreekt. Vervolgens wordt de variabele $ MissingFiles die in het volgende stuk wordt gebruikt, verhoogd naar fout en wordt gestopt als er bestanden ontbreken.
if( $ MissingFiles){ Write-Host "Kon bronbestand( en) van $ MissingFiles niet vinden. Afbreken 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 te zien krijgt, zijn als instructies aangeven dat u een operator moet gebruiken om te controleren of er een overeenkomende voorwaarde is. Hier kunnen we bijvoorbeeld gebruiken als( $ 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 nummer 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 onwaar wordt behandeld.
Als $ MissingFiles bestaat, en niet-nul is, zal Write-Host een bericht plaatsen waarin staat hoeveel bestanden ontbraken 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 dat punt uit te voeren.
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-RandomAliassen worden gebruikt om alternatieve namen voor opdrachten te maken. Deze kunnen nuttig zijn om ons te helpen kennis te maken met de nieuwe interface( bijvoorbeeld: PowerShell heeft ingebouwde aliassen zoals direct - & gt; Get-ChildItem en cat - & gt; Get-Content ) of om korte referenties te makenvoor veelgebruikte opdrachten. Hier maken we een zeer korte referentie voor de Get-Random -opdracht die veel later zal worden gebruikt.
Get-Random doet vrijwel hetzelfde als wat de naam aangeeft. 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 begint te tellen vanaf nul. Dus in plaats van Get-Random 10 , wat de natuurlijkere "geef me een nummer van 1 tot 10" betekent, betekent het echt "geef me een cijfer van 0 tot 9". Je kunt meer specifiek zijn over de nummerkeuze, zodat Get-Random gedraagt zich meer zoals je natuurlijk zou verwachten, maar dat hebben we niet nodig in dit script.
Deel 2: Gebruikersinvoer krijgen en aan de slag gaan
Terwijl een script dat slechts één willekeurige naam genereert &telefoonnummer is geweldig, het is veel beter als het script de gebruiker toestaat om te specificeren hoeveel namen &nummers die ze in één batch willen krijgen. Helaas kunnen we gebruikers niet echt vertrouwen om altijd geldige invoer te geven. Er is dus een klein beetje meer aan de hand 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 while-instructie hierboven controleert en negeert de waarde van $ ValidInput. Zolang $ ValidInput niet klopt, 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 getal.(Dat is de [int] voor 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 er vervolgens mee aan de slag te gaan.
Write-Host "` Gebruikersnamen en telefoonnummers van $ UserInput. Wees geduldig. nl "1. . $ UserInput |VoorElk-object{ & lt; # VOEG WILLEKEURIGE NAAM &NUMMERGENERATOR HIER # & gt;}Maak je geen zorgen, we laten je niet alleen achter om de willekeurige naam &nummer generator code. Dat is slechts een opmerking van plaatsaanduiding 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 einde van de tekenreeks is om een lege regel vóór en na die uitvoer in te voegen, alleen om het een visuele scheiding te geven tussen de invoerregel en de lijst met namen &getallen. Wees je ervan bewust 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 elke n .
Het volgende deel toont een andere manier waarop u een ForEach-Object-lus kunt gebruiken. Meestal, wanneer u een scriptblok een bepaald aantal keren wilt uitvoeren, stelt u een normale lus in zoals voor( $ x = 1; $ x -le $ UserInput; $ x ++){ & lt; # SCRIPT INVOEGENHIER # & gt;}. ForEach-Object laat ons dit vereenvoudigen door het een lijst van gehele getallen te geven 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? Dat is hoe we Get-Random 2 gebruiken( of de veel kortere g 2 dankzij ons alias - beide resulteren in een keuze tussen nul of één) om te beslissen of onze persoon mannelijk is of niet. De if / else-instructie kiest achteraf willekeurig een mannelijke of vrouwelijke voornaam.
Deel 4: Een willekeurig telefoonnummer genereren
Dit is echt een leuk onderdeel. 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 cijfers er op elkaar 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 formaatwe gaan het telefoonnummer volgen. 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 corresponderen 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, verpakt u het scriptblok als volgt: "$( & lt; #SCRIPT HIER # & gt;)" .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 dat we moeten doen voordat we klaar zijn om onze naam &telefoonnummer moet een Abonnee-ID genereren, die zal worden opgeslagen als $ Achtervoegsel.
-switch( $ 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 zomaarmaak vier willekeurige cijfers 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 dit 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 $ suffix 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, vergelijkbaar met hoe 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.
Dat afsluitende haakje aan de onderkant is het einde van de ForEach-Object-lus van eerder - laat dit weg als je het al hebt.
Deel 5: Opschonen en uitvoeren van het script
Nadat al het werk is gedaan, weet een goed script hoe het zichzelf opruimt. Nogmaals, de onderstaande variabele verwijdering is niet echt nodig als je het script alleen vanuit de console wilt uitvoeren, maar je zult het wel willen als je ooit van plan bent het in de ISE te gebruiken.
Remove-Item alias: \ g Remove-Variable ScriptFolder, RequiredFiles, Achternaam, Man, FirstName, NumberFormat, Prefix, Suffix, ValidInput, UserInputSla het script op met een ".ps1" extensie nadat alles klaar is.in dezelfde map als uw namenbestanden. 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:
U kunt ook een ZIP-bestand met dit PowerShell-script en tekstbestanden met naamlijsten downloaden via de onderstaande link.
Willekeurige naam &Telefoonnummergenerator voor PowerShell