Hjemmeside » hvordan » Sådan genereres tilfældige navne og telefonnumre med PowerShell

    Sådan genereres tilfældige navne og telefonnumre med PowerShell

    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.
    • 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 en masse 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 ca. 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.

    Surnames.txt bør 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 til at vælge fra. Eksempel:

    James John Robert Michael William

    Females.txt bør indeholde de kvindelige fornavne, du vil have scriptet til 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 nogens 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, da Exchange Codes ikke kan begynde med en 1 eller 0.
    • (752) 811-1375
      Dette tal er ugyldigt, fordi Exchange Codes ikke kan slutte med to 1s.
    • (265) 555-0128
      Dette nummer er ugyldigt, fordi Exchange-koden er 555, og Abonnent ID er 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 tal.

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

    Fælles 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 disse betyder før vi dykker ind i at skrive det faktisk.

    • Foreach-Objekt 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 element, der behandles.
    • hvis ellers erklæringer giver dig mulighed for 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.
    • kontakt udsagn 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å eventuelt 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 udsagn giver dig mulighed for kontinuerligt at gentage en script-blok, så længe en bestemt betingelse er opfyldt. Når der sker noget, der gør, at tilstanden ikke længere er sand, når scriptblokken er færdig, udløber sløjfen.
    • prøv ... fange udtalelser hjælper med fejlhåndtering. Hvis noget går galt med den scriptblok, der er angivet til forsøg, vil fangstblokken køre.
    • Get-indhold 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, der skal bruges sammen med andre kommandoer.
    • Write-Host sætter ting i konsollen. Dette bruges til at præsentere beskeder til brugeren og er ikke inkluderet i scriptets output, hvis output bliver omdirigeret.
    • Write-udgang faktisk genererer 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 snavset.

    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 om, 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 anden arbejdskatalog.

    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 denne scriptblok bruger testen Om test-sti 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 fra test-banen, før den videreføres til if-erklæringen. 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 single-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 præcis som-er. Dobbelt citater fortæller PowerShell at oversætte variablerne og nogle andre specielle emner indenfor strengen, før de forbinder det. Her betyder de dobbelte citater det i stedet for at køre Test-sti '$ ScriptFolder \ $ _'  vi vil faktisk gøre noget mere som Test-sti 'C: \ Scripts \ Surnames.txt' (forudsat at dit script er i C: \ Scripts, og ForEach-Object arbejder for ø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 den $ MissingFiles-variablen, der vil blive brugt i det næste stykke, for at fejl og afslutte hvis der manglede filer.

    if ($ 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 vejledninger du vil 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 skrive-vært 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. Ved 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 virkelig vil glæde os over senere.

    Ny-alias g tilfældig

    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 at lave korte referencer til almindeligt anvendte kommandoer. Her laver vi en meget kort reference for Get-Random kommando, som vil blive brugt meget senere.

    Tilfældig gør stort set hvad sit navn indebærer. 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. Det, der skal huske om Get-Random og numbers, er, at det som mange andre computeroperationer begynder at tælle fra nul. Så i stedet for Tilfældig 10 betyder det mere naturlige "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å at Tilfældige opfører sig mere som du naturligt havde Forvent, men det behøver vi ikke i dette script.

    Del 2: Få brugerindgang og komme i gang

    Mens et script, der genererer kun et tilfældigt navn og telefonnummer, er fantastisk, er det meget bedre, hvis scriptet giver brugeren mulighed for at angive, hvor mange navne og numre de ønsker at få i et parti. 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 bare $ UserInput = Læs-vært.

    mens ! $ ValidInput prøv [int] $ UserInput = Read-Host -Prompt 'elementer, der skal genereres' $ ValidInput = $ true fange Write-Host 'Ugyldig input. Indtast kun et tal. ' -ForegroundColor Red

    Den angivne angivelse ovenfor kontrollerer og negerer værdien af ​​$ ValidInput. Så længe $ ValidInput er falsk, eller eksisterer ikke, vil den fortsætte med at løbe gennem dens scriptblok.

    Forsøgsopgørelsen tager brugerinput via Read-Host og forsøger at konvertere det til en heltalværdi. (Det er det [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 undertiden gå tilbage og anmode 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 så få det til at gøre det.

    Skriv-Host "'nGenerere $ UserInput navne og telefonnumre. Vær venligst patient.'n" 1 ... $ UserInput | ForEach-Object 

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

    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. Det'n i starten og slutningen af ​​strengen er at indsætte en tom linje før og efter det output, bare for at give det en vis visuel adskillelse mellem inputlinjen og listen over navne og numre. Vær opmærksom på, at det er en back-tick (AKA "grave accent" - normalt tabellen over fanen til venstre for 1) og ikke en apostrof eller et enkelt citat foran hver n.

    Næste del viser en anden måde, du kan bruge en ForEach-Object-loop. Normalt, når du vil have en scriptblok til at køre et vist antal gange, vil du oprette en almindelig for loop ligesom for ($ x = 1; $ x -le $ UserInput; $ x ++) . 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 for.

    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.

        $ Surname = 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 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 Tilfældig 2 (eller 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-sætningen efterfølgende vælger tilfældigt et fornavn for mand eller kvinde 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.

        $ ($ 10) $ (g 10) $ (g 10) $ (g 10) $ (g 10) $ (g 10) $ (g 10) $ (g 10)  $ 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 "

    Den første linje er en simpel tilfældig talgeneration for at vælge hvilket format vi skal følge for 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: ”$ ()”. 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 udstede vores navn og 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 bare generere fire tilfældige tal 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 den 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 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.

    Denne lukkekonsol i bunden 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 færdigt, ved et godt script, hvordan man rydder op efter sig selv. Igen er den variable fjernelse nedenfor ikke nødvendigvis nødvendigt, hvis du kun vil 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 fået det hele, skal du gemme scriptet med en ".ps1" -udvidelse i 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 og telefonnummergenerator til PowerShell