10Sep

Sådan genereres tilfældige navne &Telefonnumre med PowerShell

click fraud protection

Når du har brug for et datasæt til test eller demonstration, og det sæt skal repræsentere personligt identificerbare oplysninger( PII), vil du generelt ikke bruge rigtige data, der repræsenterer de egentlige mennesker. Her går vi igennem, hvordan du kan bruge PowerShell til at generere en liste over tilfældige navne og telefonnumre til bare en sådan lejlighed.

Hvad du har brug for

Før du kommer i gang, er der nogle værktøjer og oplysninger, du skal have:

PowerShell

Dette script blev udviklet ved hjælp af PowerShell 4.0 og er også testet for kompatibilitet med PowerShell 2.0.PowerShell 2.0 eller nyere er indbygget i Windows siden Windows 7. Den er også tilgængelig til Windows XP og Vista som en del af Windows Management Framework( WMF).Nogle yderligere detaljer, og links til downloads, er nedenfor.

  • PowerShell 2.0 leveres med Windows 7. Windows XP SP3 og Vista( SP1 eller nyere) brugere kan downloade den relevante WMF-version fra Microsoft i KB968929.Det understøttes ikke på XP SP2 eller under eller Vista uden SP1.
  • instagram viewer
  • PowerShell 4.0 leveres med Windows 8.1.Windows 7 SP1-brugere kan opgradere til det som en del af en WMF-opdatering fra Microsoft Download Center. Det er ikke tilgængeligt til XP eller Vista.

Navne

Du skal bruge nogle lister over navne til at tilføre den tilfældige generator. En stor kilde til -lot af navne og oplysninger om deres popularitet( selvom det ikke vil blive brugt til dette script), er United States Census Bureau. Listerne på nedenstående links er meget store, så du vil måske trimme dem lidt, hvis du planlægger at generere mange navne og numre på én gang. På vores test system tog hvert navn / nummer par cirka 1,5 sekunder for at generere ved hjælp af de fulde lister, men din kilometertal varierer afhængigt af dine egne systemspecifikationer.

  • Efternavne
  • Mandlige fornavne
  • Kvinde fornavn

Uanset hvilken kilde du bruger, skal du generere tre tekstfiler, som scriptet kan bruge som puljer til navnevalg. Hver fil skal kun indeholde navne og kun et navn pr. Linje. Disse skal gemmes i samme mappe som dit PowerShell script.

Efternavn.txt skal indeholde de efternavne, du vil have scriptet til at vælge fra. Eksempel:

Smith Johnson Williams Jones Brown

Males.txt skal indeholde de mandlige fornavne, du vil have scriptet at vælge fra. Eksempel:

James John Robert Michael William

Females.txt skal indeholde de kvindelige fornavne, du vil have scriptet at vælge fra. Eksempel:

Mary Patricia Linda Barbara Elizabeth

Regler for telefonnumre

Hvis du vil være sikker på, at dine telefonnumre ikke svarer til alles rigtige telefonnummer, er den nemmeste måde at bruge den kendte "555" Exchange Code. Men hvis du skal vise et datasæt med mange telefonnumre, vil den 555 begynde at se ret monotont rigtigt hurtigt. For at gøre tingene mere interessante, genererer vi andre telefonnumre, der overtræder reglerne for nordamerikansk nummereringsplan( NANP).Nedenfor er nogle eksempler ugyldige telefonnumre, der repræsenterer hver klasse af nummer, der vil blive genereret af dette script:

  • ( 157) 836-8167
    Dette tal er ugyldigt, fordi områdekoder ikke kan begynde med en 1 eller 0.
  • ( 298) 731-6185
    Dette tal er ugyldigt, fordi NANP ikke tildeler områdekoder med 9 som andet ciffer.
  • ( 678) 035-7598
    Dette nummer er ugyldigt, fordi Exchange-koder ikke kan begynde med en 1 eller 0.
  • ( 752) 811-1375
    Dette nummer er ugyldigt, fordi Exchange-koderne ikke kan slutte med to 1s.
  • ( 265) 555-0128
    Dette nummer er ugyldigt, fordi Exchange-koden er 555, og , abonnent-id'et ligger inden for det område, der er forbeholdt fiktive tal.
  • ( 800) 555-0199
    Dette nummer er det eneste 800 nummer med en 555 Exchange Code, som er reserveret til brug som et fiktivt nummer.

Bemærk, at ovenstående regler kan ændres og kan variere efter jurisdiktion. Du bør gøre din egen forskning for at verificere de nuværende regler, som gælder for den lokale, som du vil generere telefonnumre til.

Almindelige kommandoer

Der er nogle temmelig almindelige kommandoer, der skal bruges i hele dette script, så du bør få en grundlæggende ide om hvad dette betyder før vi dykker ind i at skrive det faktisk.

  • ForEach-Object tager et array eller en liste over objekter og udfører den angivne operation på hver af dem. Indenfor en ForEach-Object-scriptblok bruges $ _-variablen til at referere til det aktuelle emne, der behandles.
  • hvis. .. ellers erklæringer tillader dig kun at udføre en operation, hvis visse betingelser er opfyldt, og( valgfrit) angive, hvad der skal gøres, når denne betingelse ikke er opfyldt.
  • switch erklæringer er som hvis udsagn med flere valg. Switch vil kontrollere et objekt mod flere betingelser og køre uanset scriptblokke er angivet for betingelser, som objektet matcher. Du kan også valgfrit angive en standardblok, som kun kører, hvis ingen andre betingelser matches. Switch-sætninger bruger også $ _-variablen til at henvise til det aktuelle element, der behandles.
  • mens erklæringer giver dig mulighed for løbende at gentage en scriptblok, så længe en bestemt betingelse er opfyldt. Når der sker noget, der gør, at betingelsen ikke længere er sandt, når scriptblokken er færdig, udløber sløjfen.
  • prøv. .. fange udsagn om hjælp til fejlhåndtering. Hvis noget går galt med den scriptblok, der er angivet til forsøg, vil fangstblokken køre.
  • Get-Content gør hvad der står på tin. Det får indholdet af en bestemt genstand - normalt en fil. Dette kan bruges til at vise indholdet af en tekstfil på konsollen eller, som i dette script, sende indholdet langs rørledningen, som skal bruges sammen med andre kommandoer.
  • skrive-vært lægger ting i konsollen. Dette bruges til at præsentere beskeder til brugeren og er ikke inkluderet i scriptets output, hvis output bliver omdirigeret.
  • skrive-udgang genererer faktisk output. Normalt dumpes dette til konsollen, men det kan også omdirigeres af andre kommandoer.

Der er andre kommandoer i scriptet, men vi forklarer dem, som vi går.

Opbygning af scriptet

Nu er det tid til at få vores hænder beskidte.

Del 1: Klar til at gå

Hvis du kan lide dit script til at begynde at køre fra en ren konsol, her er den første linje, du vil have i den.

Clear-Host

Nu hvor vi har en ren skærm, er det næste, vi vil gøre, at få scriptet til at sikre, at alt det, der er brug for, er på plads. For at gøre det, skal vi begynde med at fortælle det, hvor de skal se, og hvad de skal kigge efter.

$ ScriptFolder = Split-Path $ MyInvocation. MyCommand. Definition -Parent $ RequiredFiles =( 'Males.txt', 'Females.txt', 'Surnames.txt')

Den første linje der er meget nyttigt for ethvert script. Det definerer en variabel, der peger på den mappe, der indeholder scriptet. Dette er vigtigt, hvis dit script har brug for andre filer, der er placeret i samme mappe som sig selv( eller en kendt relativ sti fra den pågældende mappe), fordi du ellers vil støde på fejl, hvis og når du forsøger at køre scriptet mens du er i en andenarbejdskatalog.

Den anden linje opretter en række filnavne, der kræves for at scriptet skal køre korrekt. Vi bruger dette sammen med $ ScriptFolder-variablen i det næste stykke, hvor vi kontrollerer, at disse filer er til stede.

$ RequiredFiles |ForEach-Object{ if( !( Test-Path "$ ScriptFolder \ $ _")){ Skriv-Host "$ _ ikke fundet."-ForegroundColor Red $ MissingFiles ++}}

Denne del af script sender arrayet RequiredFiles til en ForEach-Object-blok. Inden for den pågældende scriptblok bruger testen til test-stien til at se, om filen vi leder efter, er den tilhører. Test-Path er en simpel kommando, der, når den gives en filsti, returnerer et grundlæggende sandt eller falsk svar for at fortælle os, om stien peger på noget der eksisterer. Udråbstegnet er der en ikke operatør, som reverserer responsen af ​​Test-Path, før den videreføres til if-sætningen. Så hvis test-path returnerer false( det vil sige den fil vi leder efter eksisterer ikke), vil den blive konverteret til ægte, så at if-sætningen vil udføre sin scriptblok.

En anden ting at bemærke her, som ofte vil blive brugt i dette script, er brugen af ​​dobbelt citater i stedet for enkelt citater. Når du sætter noget i single-citater, behandler PowerShell det som en statisk streng. Uanset hvad der er i det enkelte citat, vil det blive overført nøjagtigt som det er. Double-citater fortæller PowerShell at oversætte variablerne og nogle andre specielle emner indenfor strengen, før de forbinder den. Her betyder dobbeltkvoterne, at vi i stedet for at køre Test-Path '$ ScriptFolder \ $ _' faktisk vil gøre noget mere som Test-Path 'C: \ Scripts \ Surnames.txt' ( forudsat at dinscript er i C: \ Scripts, og ForEach-Object arbejder i øjeblikket på 'Surnames.txt').

For hver fil, der ikke findes, vil skrive-vært sende en fejlmeddelelse i rødt for at fortælle hvilken fil der mangler. Derefter øges det $ MissingFiles-variablen, der vil blive brugt i det næste stykke, for at fejl og afslutte, hvis der manglede filer.

hvis( $ MissingFiles){ Write-Host "Kunne ikke finde $ MissingFiles kildefil( er). Afbrydende script."-ForegroundColor Red Fjern-Variabel ScriptFolder, RequiredFiles, MissingFiles Exit}

Her er et andet pænt trick du kan gøre med, hvis udsagn. De fleste guider vil du se om, hvis udsagn vil fortælle dig, at du bruger en operatør til at tjekke for en matchende tilstand. Her kan vi f.eks. Bruge hvis( $ MissingFiles -gt 0) for at se om $ MissingFiles er større end nul. Men hvis du allerede bruger kommandoer, der returnerer en boolesk værdi( som i den foregående blok, hvor vi brugte test-sti), er det ikke nødvendigt. Du kan også undvære det i tilfælde som dette, når du bare tester for at se om et tal er ikke-nul. Enhver ikke-nul nummer( positiv eller negativ) bliver behandlet som sand, mens nul( eller som det kan ske her, en ikke-eksisterende variabel) bliver behandlet som falsk.

Hvis $ MissingFiles eksisterer, og er ikke-nul, vil Write-Host sende en besked, der fortæller dig, hvor mange filer der manglede, og at scriptet vil afbryde. Derefter vil Fjern-Variable rydde op alle de variabler, vi har oprettet, og Exit vil stoppe scriptet. På den almindelige PowerShell-konsol er Fjern-Variabel ikke rigtig nødvendig til dette formål, fordi variabler, der er indstillet af scripts, normalt kasseres, når scriptet forlader. PowerShell ISE opfører sig dog lidt anderledes, så du vil måske beholde dette, hvis du planlægger at køre scriptet derfra.

Hvis alle ting er i orden, vil scriptet fortsætte. En yderligere forberedelse til at lave er et alias, som vi vil være rigtig glad for senere.

Ny alias g Random

Aliaser bruges til at oprette alternative navne til kommandoer. Disse kan være nyttige for at hjælpe os med at gøre sig bekendt med den nye grænseflade( f.eks. PowerShell har indbyggede aliaser som dir -> Get-ChildItem og kat -> Get-Content ) eller til at lave korte referencertil almindeligt anvendte kommandoer. Her laver vi en meget kort reference til Random kommandoen, som senere vil blive brugt.

Hent Random gør stort set hvad navnet betyder. Givet en matrix( som en liste over navne) som input, vælger den et tilfældigt element fra arrayet og spytter det ud. Det kan også bruges til at generere tilfældige tal. Den ting at huske om Get-Random og tallene er dog, at det ligesom mange andre computeroperationer begynder at tælle fra nul. Så i stedet for Random 10 betyder mere naturligt "Giv mig et tal fra 1 til 10" betyder det virkelig "Giv mig et tal fra 0 til 9." Du kan være mere specifik om antallet valg, så Get-Random opfører sig mere som du naturligvis ville forvente, men vi behøver det ikke i dette script.

Del 2: Få brugerindgang og arbejde

Mens et script, der genererer kun ét tilfældigt navn &Telefonnummeret er stort, det er meget bedre, hvis scriptet giver brugeren mulighed for at angive, hvor mange navne &numre de ønsker at få i en batch. Desværre kan vi ikke rigtig have tillid til, at brugerne altid giver gyldig input. Så der er en lille smule mere til dette end blot $ UserInput = Read-Host .

mens( ! $ ValidInput){ prøv{ [int] $ UserInput = Læs-Host -Prompt 'Items, der skal genereres' $ ValidInput = $ true} fange{ Write-Host 'Ugyldig indgang. Indtast kun et tal. '-ForegroundColor Red}}

Mens udsagnet ovenfor kontrollerer og negerer værdien af ​​$ ValidInput. Så længe $ ValidInput er fejlagtigt eller ikke eksisterer, vil det fortsætte med at løbe igennem dens scriptblok.

Prøveopgørelsen tager brugerindgang via Read-Host og forsøger at konvertere det til en heltalværdi.(Det er [int] før Read-Host.) Hvis det lykkes, vil det sætte $ ValidInput til true, så at while loop kan lukke. Hvis det ikke lykkes, angiver fangstblokken en fejl, og fordi $ ValidInput ikke blev indstillet, vil samtidig løkken komme tilbage og spørge brugeren igen.

Når brugeren har givet et tal som input, ønsker vi at scriptet skal annoncere, at det skal begynde at gøre sit arbejde og derefter få det til at gøre det.

Write-Host "` nGenerating $ UserInput navne og telefonnumre. Vær så tålmodig.`n "1. . $ UserInput |ForEach-Object{ & lt; # INSERT RANDOM NAME &NUMBER GENERATOR HER # & gt;}

Bare rolig, vi kommer ikke til at forlade dig alene for at finde ud af det tilfældige navn &nummer generator kode. Det er bare en pladsholder kommentar til at vise dig, hvor den næste sektion( hvor det virkelige arbejde bliver gjort) passer til.

Skriv-Host-linjen er ret ligetil. Det siger blot, hvor mange navne og telefonnumre scriptet skal generere, og beder brugeren være tålmodig, mens scriptet gør sit arbejde. `n i starten og slutningen af ​​strengen er at indsætte en tom linje før og efter denne udgang, bare for at give den en vis visuel adskillelse mellem inputlinjen og listen over navne og amp;numre. Vær opmærksom på, at det er en back-tick( AKA "grave accent" - normalt tasten over fanen til venstre for 1) og ikke en apostrof eller et enkelt citat foran hver n .

Den næste del viser en anden måde, hvorpå du kan bruge en ForEach-Object-loop. Når du vil have en scriptblok til at køre et vist antal gange, vil du typisk oprette en almindelig loop som for( $ x = 1; $ x -le $ UserInput; $ x ++){ & lt; # INSERT SCRIPTHER # & gt;}. ForEach-Object lader os forenkle dette ved at føje det til en liste over heltal og i stedet for at fortælle det, at det faktisk gør noget med disse heltal, giver vi det bare en statisk scriptblok til at løbe, indtil den løber ud af heltal for at gøre det til.

Del 3: Generering af et tilfældigt navn

Generering af navnet er den enkleste del af resten af ​​denne proces. Den består kun af tre trin: Plukker et efternavn, vælger et køn og vælger et fornavn. Husk at alias, vi lavede for tilfældig tid tilbage? Tid til at begynde at sætte det til at bruge.

$ Efternavn = Get-Content "$ ScriptFolder \ Surnames.txt" |g $ Mand = g 2 hvis( $ Mand){ $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" |g} else{ $ FirstName = Get-Content "$ ScriptFolder \ Females.txt" |g}

Den første linje tager vores liste over efternavne, føder den ind i tilfældig picker og tildeler det valgte navn til $ Efternavn.

Den anden linje vælger vores persons køn. Husk, hvordan Get-Random begynder at tælle fra nul, og hvordan nul er falsk, og alt andet er sandt? Sådan bruger vi Random 2 ( eller den meget kortere g 2 takket være vores alias - begge resulterer i et valg mellem nul eller en) for at afgøre, om vores person er mand eller ej. Hvis / else-udsagnet efterfølgende vælger et manligt eller kvindeligt fornavn i overensstemmelse hermed.

Del 4: Generering af et tilfældigt telefonnummer

Her er den rigtig sjove del. Tidligere viste vi dig, hvordan du kan lave et ugyldigt eller fiktivt telefonnummer på flere måder. Da vi ikke ønsker at alle vores tal ser for ligner hinanden, vælger vi tilfældigt et ugyldigt nummerformat hver gang. De tilfældigt valgte formater defineres af deres områdekode og udvekslingskode, som samlet set gemmes som $ prefix.

$ NumberFormat = g 5 switch( $ NumberFormat){ 0{ $ Prefix = "($( g 2) $( g 10) $( g 10)) $( g 10) $( g 10) $( g 10)"{$ Prefix ="( $ 10) 9 $( g 10)) $( g 10) $( g 10) $( g 10) "} 2{ $ Prefix ="( $( 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 "}}

Den første linje er en ligefrem tilfældig talgeneration for at vælge hvilket formatvi følger til telefonnummeret. Derefter tager switch-sætningen det tilfældige valg og genererer et $ præfiks i overensstemmelse hermed. Husk at listen over ugyldige telefonnummertyper?$ NumberFormat værdierne 0-3 svarer til de første fire i denne liste. Værdi 4 kan generere et af de sidste to, da begge bruger "555" Exchange Code.

Her kan du også se, at vi bruger et andet trick med dobbelt citater. Dobbelt citater giver dig ikke bare mulighed for at fortolke variabler, før en streng får output - de lader dig også behandle scriptblokke. For at gøre det, pakker du scriptblokken således: "$( & lt; #SCRIPT HERE # & gt;)" .Så hvad du har ovenfor er mange individuelt randomiserede cifre, med nogle af dem enten begrænset i deres rækkevidde eller angivet statisk i overensstemmelse med de regler, vi skal følge. Hver streng har også parentes og mellemrum, som du normalt ville forvente at se i et områdekode og Exchange Code-par.

Det sidste, vi skal gøre, før vi er klar til at udstille vores navn &Telefonnummer er at generere et abonnent-id, som vil blive gemt som $ Suffix.

switch( $ NumberFormat){ {$ _ -lt 4}{ $ Suffix = "$( g 10) $( g 10) $( g 10) $( g 10)"} 4{ switch( $ Prefix){ '(800) 555 '{$ Suffix =' 0199 '} standard{ $ Suffix = "01 $( g 10) $( g 10)"}}}}

På grund af de særlige regler for 555 numre kan vi ikke baregenerere fire tilfældige cifre for slutningen af ​​hvert telefonnummer, som vores script skal lave. Så kontrollerer den første kontakt for at se, om vi har et 555-nummer. Hvis ikke, genererer det fire tilfældige cifre. Hvis det er et 555-nummer, kontrollerer den anden kontakt 800-områdenummeret. Hvis det matcher, er der kun en gyldig $ Suffix, vi kan bruge. Ellers er det tilladt at vælge mellem noget mellem 0100-0199.

Bemærk, at der er et par forskellige måder, denne blok kunne have været skrevet, i stedet for den måde den er på.Begge switch statements kunne have været erstattet med if / else udsagn, da de hver især kun håndterer to valg. I stedet for at specifikt kalde "4" som en mulighed for den første switch-sætning, kunne "standard" have været brugt som det var blevet gjort i det andet, da det var den eneste mulighed, der var tilbage. Valget mellem if / else vs switch, eller hvor du skal bruge standard søgeordet i stedet for specifikke værdier, kommer ofte til et spørgsmål om personlig præference. Så længe det virker, skal du bruge det, du er mest komfortabel med.

Nu er det tid til output.

Skriv-udgang "$ Fornavn $ Efternavn $ Prefix- $ Suffix"}

Denne er temmelig så enkel som den får i scriptet. Det udsender bare for- og efternavnet adskilt af mellemrum og derefter et andet mellemrum før telefonnummeret. Her er hvor standard bindestreg mellem Exchange Code og Subscriber ID også tilføjes.

Den lukkede beslag nederst er slutningen af ​​ForEach-Object-sløjfen fra tidligere - udelad dette, hvis du allerede har fået det.

Del 5: Oprydning og kørsel af scriptet

Efter alt arbejdet er udført, ved et godt script, hvordan man kan rydde op efter sig selv. Igen er den variable fjernelse nedenfor ikke nødvendigvis nødvendigt, hvis du kun skal køre scriptet fra konsollen, men du vil have det, hvis du planlægger at køre det i ISE.

Fjern-Item-alias: \ g Fjern-Variabel ScriptFolder, RequiredFiles, Efternavn, Mand, Fornavn, NummerFormat, Prefix, Suffix, ValidInput, UserInput

Når du har gjort alt, skal du gemme scriptet med en ".ps1" -udvidelsei samme mappe som dine navnefiler. Sørg for, at din ExecutionPolicy er indstillet, så scriptet kan køre og give det en hvirvel.

Her er et skærmbillede af scriptet i aktion:

Du kan også downloade en ZIP-fil, der indeholder dette PowerShell-script og tekstfiler med navnelister, fra linket nedenfor.

Tilfældigt navn &Telefonnummer Generator til PowerShell