10Sep

Slik genererer du tilfeldige navn &Telefonnumre med PowerShell

click fraud protection

Når du trenger et datasett for testing eller demonstrasjon, og det settet må representere personlig identifiserbar informasjon( PII), vil du vanligvis ikke bruke ekte data som representerer faktiske personer. Her går vi gjennom hvordan du kan bruke PowerShell til å generere en liste over tilfeldige navn og telefonnumre for en slik anledning.

Hva du trenger

Før du kommer i gang, er det noen verktøy og informasjon du bør ha:

PowerShell

Dette skriptet ble utviklet med PowerShell 4.0, og har også blitt testet for kompatibilitet med PowerShell 2.0.PowerShell 2.0 eller nyere har blitt innebygd i Windows siden Windows 7. Det er også tilgjengelig for Windows XP og Vista som en del av Windows Management Framework( WMF).Noen ytterligere detaljer, og linker for nedlastinger, er under.

  • PowerShell 2.0 leveres med Windows 7. Windows XP SP3 og Vista( SP1 eller nyere) brukere kan laste ned den riktige WMF-versjonen fra Microsoft i KB968929.Det støttes ikke på XP SP2 eller under, eller Vista uten SP1.
  • instagram viewer
  • PowerShell 4.0 leveres med Windows 8.1.Windows 7 SP1-brukere kan oppgradere til det som en del av en WMF-oppdatering fra Microsoft Download Center. Det er ikke tilgjengelig for XP eller Vista.

Navn

Du trenger noen lister med navn for å mate inn tilfeldig generator. En stor kilde til en -masse av navn, og informasjon om deres popularitet( selv om det ikke vil bli brukt til dette skriptet), er United States Census Bureau. Lister som er tilgjengelige på linkene under er svært store, så du vil kanskje trimme dem litt hvis du planlegger å generere mange navn og numre samtidig. På vårt testsystem tok hvert navn / nummerpar ca 1,5 sekunder for å generere ved hjelp av de fullstendige lister, men kjørelengde vil variere avhengig av dine egne systemspesifikasjoner.

  • Etternavn
  • Mann fornavn
  • Kvinne fornavn

Uavhengig av kilden du bruker, må du generere tre tekstfiler som skriptet kan bruke som bassenger for navnevalg. Hver fil skal bare inneholde navn, og bare ett navn per linje. Disse må lagres i samme mappe som PowerShell-skriptet.

Etternavn.txt skal inneholde etternavnene du vil at skriptet skal velge fra. Eksempel:

Smith Johnson Williams Jones Brown

Males.txt skal inneholde de mannlige fornavnene du vil at skriptet skal velge fra. Eksempel:

James John Robert Michael William

Females.txt skal inneholde de kvinnelige fornavnene du vil at skriptet skal velge fra. Eksempel:

Mary Patricia Linda Barbara Elizabeth

Regler for telefonnumre

Hvis du vil være sikker på at telefonnumrene dine ikke samsvarer med noen ekte telefonnummer, er den enkleste måten å bruke den kjente "555" Exchange Code. Men hvis du skal vise et datasett med mange telefonnumre, vil den 555 begynne å se ganske monotont veldig fort. For å gjøre ting mer interessant, genererer vi andre telefonnumre som bryter med NANP-reglene( North American Numbering Plan).Nedenfor er noen eksempler ugyldige telefonnumre, som representerer hver klasse av nummer som skal genereres av dette skriptet:

  • ( 157) 836-8167
    Dette nummeret er ugyldig fordi områdekoder ikke kan begynne med en 1 eller 0.
  • ( 298) 731-6185
    Dette nummeret er ugyldig fordi NANP ikke tilordner områdekoder med 9 som det andre sifferet.
  • ( 678) 035-7598
    Dette nummeret er ugyldig fordi Exchange-koder ikke kan starte med en 1 eller 0.
  • ( 752) 811-1375
    Dette nummeret er ugyldig fordi Exchange-koder ikke kan avsluttes med to 1s.
  • ( 265) 555-0128
    Dette nummeret er ugyldig, fordi Exchange-koden er 555, og , abonnent-IDen er innenfor området som er reservert for fiktive tall.
  • ( 800) 555-0199
    Dette nummeret er det eneste 800-nummeret med en 555 Exchange-kode som er reservert for bruk som et fiktivt nummer.

Vær oppmerksom på at reglene ovenfor kan endres og kan variere etter jurisdiksjon. Du bør gjøre din egen undersøkelse for å bekrefte gjeldende regler som gjelder for lokalen som du vil generere telefonnumre for.

Vanlige kommandoer

Det er noen ganske vanlige kommandoer som skal brukes i hele dette skriptet, så du bør få en grunnleggende ide om hva dette betyr før vi dykker inn i å skrive det.

  • ForEach-Object tar en matrise, eller en liste over objekter, og utfører den angitte operasjonen på hver av dem. Innenfor en ForEach-Object-scriptblokk brukes $ _-variabelen til å referere til det nåværende elementet som behandles.
  • hvis. .. ellers -setninger tillater deg å utføre en operasjon bare hvis visse betingelser er oppfylt, og( valgfritt) spesifisere hva som skal gjøres når tilstanden ikke er oppfylt.
  • -svitsjer -setninger er som om utsagn med flere valg. Byttet kontrollerer et objekt mot flere forhold, og kjører hva som helst skriptblokker er angitt for forhold som objektet samsvarer med. Du kan også, valgfritt, angi en standardblokk som bare vil kjøre hvis ingen andre forhold matches. Switch-setninger bruker også $ _-variabelen for å referere til det aktuelle elementet som behandles.
  • mens -setningene tillater deg å kontinuerlig gjenta en scriptblokk så lenge en bestemt tilstand er oppfylt. Når noe skjer som forårsaker at tilstanden ikke lenger er sant når manuset er ferdig, går sløyfen ut.
  • prøve. .. ta tak i -setninger med feilhåndtering. Hvis noe går galt med skriptblokken som er oppgitt for prøve, vil fangstblokken løpe.
  • Get-Content gjør det som står på tinnet. Det blir innholdet i et spesifisert objekt - vanligvis en fil. Dette kan brukes til å vise innholdet i en tekstfil på konsollen eller, som i dette skriptet, sende innholdet langs rørledningen som skal brukes med andre kommandoer.
  • skrive-vert setter ting i konsollen. Dette brukes til å presentere meldinger til brukeren, og er ikke inkludert i skriptets utdata hvis utgangen blir omdirigert.
  • skriveutgang genererer faktisk produksjon. Normalt dumpes dette til konsollen, men det kan også omdirigeres av andre kommandoer.

Det finnes andre kommandoer i skriptet, men vi vil forklare dem når vi går.

Bygge skriptet

Nå er det på tide å få hendene skitne.

Del 1: Gjør deg klar til å gå

Hvis du liker at skriptet ditt skal starte fra en ren konsoll, er den første linjen du vil ha i den.

Clear-Host

Nå som vi har en ren skjerm, er det neste tingen vi vil gjøre, å få skriptet til å kontrollere at alt det trenger er på plass. For å gjøre det, må vi begynne med å fortelle hvor du skal se og hva du skal se etter.

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

Den første linjen der er veldig nyttig for et script. Den definerer en variabel som peker på mappen som inneholder skriptet. Dette er viktig hvis skriptet trenger andre filer som ligger i samme katalog som seg selv( eller en kjent relativ sti fra den katalogen), fordi du ellers vil støte på feil hvis og når du prøver å kjøre skriptet mens du er i en annenarbeidskatalog.

Den andre linjen oppretter en rekke filnavn som kreves for at skriptet skal kjøre riktig. Vi bruker dette, sammen med $ ScriptFolder-variabelen, i neste stykke der vi kontrollerer at filene er til stede.

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

Dette stykket av skript sender $ RequiredFiles-arrayet til en ForEach-Object-blokk. Innenfor denne skriptblokken bruker if-setningen Test-Path for å se om filen vi leter etter er hvor den tilhører. Test-Path er en enkel kommando som, når den oppgis en filbane, returnerer et grunnleggende sant eller falskt svar for å fortelle oss om banen peker på noe som eksisterer. Utropstegnet der er en ikke -operatør, som reverserer responsen til Test-Path før den overføres til if-setningen. Så hvis test-banen returnerer false( det vil si filen vi leter etter eksisterer ikke), blir den konvertert til sann, slik at hvis-setningen vil utføre sin scriptblokk.

En annen ting å merke seg her, som ofte vil bli brukt i dette skriptet, er bruken av doble anførselstegn i stedet for single-sitater. Når du setter noe i single-sitater, behandler PowerShell det som en statisk streng. Uansett hva som er i det enkle sitatet vil bli sendt videre akkurat som det er. Dobbelkvoter forteller PowerShell å oversette variablene og noen andre spesielle elementer i strengen før de overføres. Her betyr dobbeltkvitene at i stedet for å kjøre Test-Path '$ ScriptFolder \ $ _' , vil vi faktisk gjøre noe mer som Test-Path 'C: \ Scripts \ Surnames.txt' ( forutsatt at dinSkriptet er i C: \ Scripts, og ForEach-Object jobber for tiden på 'Surnames.txt').

For hver fil ikke funnet, vil skrive-vert legge inn en feilmelding i rødt for å fortelle hvilken fil som mangler. Deretter øker det $ MissingFiles-variabelen som vil bli brukt i neste stykke, for å feil og avslutte hvis det manglet noen filer.

hvis( $ MissingFiles){ Write-Host "Kunne ikke finne $ MissingFiles kildefil( er). Aborting script."-ForegroundColor Red Remove-Variable ScriptFolder, RequiredFiles, MissingFiles Exit}

Her er et annet pent trick du kan gjøre med hvis uttalelser. De fleste guider vil du se om setninger vil fortelle deg at du bruker en operatør for å sjekke om en matchende tilstand. For eksempel, her kan vi bruke hvis( $ MissingFiles -gt 0) for å se om $ MissingFiles er større enn null. Men hvis du allerede bruker kommandoer som returnerer en boolesk verdi( som i den forrige blokken hvor vi brukte testbanen), er det ikke nødvendig. Du kan også gjøre uten det i tilfeller som dette, når du bare tester for å se om et tall ikke er null. Eventuelt ikke-null-nummer( positivt eller negativt) blir behandlet som sant, mens null( eller, som det kan skje her, en ikke-eksisterende variabel) blir behandlet som feil.

Hvis $ MissingFiles eksisterer, og ikke er null, vil Write-Host legge inn en melding som forteller deg hvor mange filer som manglet, og at skriptet vil avbrytes. Deretter fjerner-variabel vil rydde opp alle variablene vi har opprettet og Avslutt vil avslutte skriptet. På den vanlige PowerShell-konsollen er Fjern-Variabel egentlig ikke nødvendig for dette formålet, fordi variabler som er angitt av skript, normalt kasseres når skriptet utgår. PowerShell ISE oppfører seg imidlertid litt annerledes, slik at du kanskje vil beholde dette hvis du planlegger å kjøre skriptet derfra.

Hvis alle ting er i orden, vil skriptet fortsette videre. En annen forberedelse å lage er et alias som vi vil være veldig glad for senere.

Ny alias g Tilfeldig

Aliaser brukes til å opprette alternative navn på kommandoer. Disse kan være nyttige for å hjelpe oss med å bli kjent med det nye grensesnittet( for eksempel: PowerShell har innebygde aliaser som dir -> Get-ChildItem og katt -> Get-Content ) eller for å lage korte referanserfor vanlig brukte kommandoer. Her lager vi en veldig kort referanse til Random -kommandoen som kommer til å bli brukt mye senere.

Tilfeldig gjør ganske mye hva navnet tilsier. Gitt en matrise( som en liste over navn) som input, plukker den et tilfeldig element fra matrisen og spytter det ut. Det kan også brukes til å generere tilfeldige tall. Tingen å huske om Get-Random og tallene er at det, som mange andre datoperasjoner, begynner det å telle fra null. Så i stedet for Tilfeldig 10 betyr det mer naturlige "gi meg et tall fra 1 til 10" betyr det egentlig "gi meg et tall fra 0 til 9." Du kan være mer spesifikk om nummervalget, slik at Get-Random oppfører seg mer som du selvfølgelig ville forvente, men vi trenger ikke det i dette skriptet.

Del 2: Få brukerinngang og komme til å fungere

Mens et skript som genererer bare ett tilfeldig navn &Telefonnummeret er flott, det er mye bedre hvis manuset lar brukeren angi hvor mange navn &tall de ønsker å få i en batch. Dessverre kan vi ikke stole på at brukerne alltid skal gi gyldig innspilling. Så det er litt mer til dette enn bare $ UserInput = Read-Host .

mens( ! $ ValidInput){ prøv{ [int] $ UserInput = Les-Host -Prompt 'Elementer som skal genereres' $ ValidInput = $ true} fange{ Write-Host 'Ugyldig inngang. Skriv bare inn et tall. '-ForegroundColor Red}}

Mens setningen over sjekker for og negerer verdien av $ ValidInput. Så lenge $ ValidInput er feil, eller eksisterer ikke, vil det fortsette å løpe gjennom sin scriptblokk.

Prøv-setningen tar brukerinngang, via Read-Host, og forsøker å konvertere det til et heltall.(Det er [int] før Read-Host.) Hvis det lykkes, vil det sette $ ValidInput til true slik at mens sløyfen kan gå ut. Hvis ikke vellykket, legger fangstblokken en feilmelding, og fordi $ ValidInput ikke ble satt, vil samtidig sløyfen komme tilbake og spørre brukeren igjen.

Når brukeren har gitt et nummer som input, vil vi at skriptet skal kunngjøre at det skal begynne å faktisk gjøre sitt arbeid og deretter få om å gjøre det.

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

Ikke bekymre deg, vi kommer ikke til å forlate deg selv for å finne ut det tilfeldige navnet &nummer generator kode. Det er bare en plassholderkommentar for å vise deg hvor neste del( hvor det virkelige arbeidet blir gjort) kommer til å passe.

Skriv-Host-linjen er ganske enkel. Det sier bare hvor mange navn og telefonnumre skriptet skal generere, og spør brukeren om å være tålmodig mens manuset gjør sitt arbeid. `n ved begynnelsen og slutten av strengen er å sette inn en tom linje før og etter den utgangen, bare for å gi den litt visuell adskillelse mellom inngangslinjen og listen over navn &tall. Vær oppmerksom på at det er en back-tick( AKA "grave aksent" - vanligvis nøkkelen over tabellen, til venstre for 1) og ikke en apostrof eller et enkelt sitat foran hver n .

Den neste delen viser en annen måte at du kan bruke en ForEach-Object-sløyfe. Vanligvis, når du vil at en skriptblokk skal kjøre et bestemt antall ganger, vil du sette opp en vanlig for loop som for( $ x = 1; $ x -le $ UserInput; $ x ++){ & lt; # INSERT SCRIPTHER # & gt;}. ForEach-Object lar oss forenkle dette ved å mate det med en liste over heltall, og i stedet for å fortelle det å faktisk gjøre noe med disse heltallene, gir vi bare en statisk skriptblokk for å løpe til den løper ut av heltall for å gjøre det for.

Del 3: Generere et tilfeldig navn

Generering av navnet er den enkleste delen av resten av denne prosessen. Den består bare av tre trinn: Plukker et etternavn, plukker et kjønn og velger et fornavn. Husk at aliaset vi laget for å få tilfeldig tid tilbake? Tid til å begynne å sette det til å bruke.

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

Den første linjen tar vår liste over etternavn, mater den inn i tilfeldig plukker, og tilordner det valgte navnet til $ Etternavn.

Den andre linjen velger personens kjønn. Husk hvordan Get-Random begynner å telle fra null, og hvordan null er falsk og alt annet er sant? Slik bruker vi Tilfeldig 2 ( eller den mye kortere g 2 takket være vårt alias - begge resulterer i et valg mellom null eller en) for å avgjøre om vår person er mann eller ikke. Hvis / else-setningen etterpå velger tilfeldig et mannlig eller kvinnelig fornavn tilsvarende.

Del 4: Generere et tilfeldig telefonnummer

Her er den veldig morsomme delen. Tidligere viste vi deg hvordan det finnes flere måter du kan lage et ugyldig eller fiktivt telefonnummer på.Siden vi ikke vil at alle våre tall ser ut til å likne hverandre, velger vi tilfeldig et ugyldig nummerformat hver gang. De tilfeldig valgte formatene blir definert av deres områdekode og utvekslingskode, som samlet sett blir lagret som $ prefix.

$ NumberFormat = g 5 bryter( $ 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 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 linjen er en enkel tilfeldig talgenerering for å velge hvilket formatVi skal følge for telefonnummeret. Deretter tar bryteretningen det tilfeldige valget og genererer et $ Prefix tilsvarende. Husk at listen over ugyldige telefonnummertyper?$ NumberFormat-verdiene 0-3 tilsvarer de fire første i denne listen. Verdi 4 kan generere en av de to siste, siden begge bruker "555" Exchange Code.

Her kan du også se at vi bruker et annet triks med dobbelthender. Doble sitater lar deg ikke bare tolke variabler før en streng får output - de lar deg også behandle skriptblokker. For å gjøre det, pakker du skriptblokken slik: "$( & lt; #SCRIPT HERE # & gt;)" .Så hva du har over er mange individuelt randomiserte sifre, med noen av dem enten begrenset i deres rekkevidde eller satt statisk i henhold til reglene vi må følge. Hver streng har også parentes og avstand som du normalt forventer å se i et områdekode og et Exchange Code-par.

Det siste vi må gjøre før vi er klare til å sende ut navnet vårt &Telefonnummeret er å generere en abonnent-ID, som vil bli lagret som $ Suffix.

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

På grunn av de spesielle reglene for 555 tall, kan vi ikke baregenerere fire tilfeldige tall for slutten av hvert telefonnummer som vårt skript skal gjøre. Så sjekker den første bryteren for å se om vi har et 555-nummer. Hvis ikke, genererer det fire tilfeldige siffer. Hvis det er et 555-nummer, kontrollerer den andre bryteren for 800-retningsnummeret. Hvis det samsvarer, er det bare en gyldig $ Suffix vi kan bruke. Ellers er det lov å velge mellom noe mellom 0100-0199.

Vær oppmerksom på at det er noen forskjellige måter denne blokken kunne ha blitt skrevet, i stedet for måten den er. Begge bryteretningene kunne ha blitt erstattet med if / else setninger, siden de hver eneste håndterer to valg. Også, i stedet for å spesifikt kalle "4" som et alternativ for den første bryteretningen, kunne "standard" vært brukt på samme måte som det var gjort i det andre siden det var det eneste alternativet igjen. Valget mellom if / else vs switch, eller hvor du skal bruke standard søkeordet i stedet for bestemte verdier, kommer ofte ned til et spørsmål om personlig preferanse. Så lenge det fungerer, bruk det du er mest komfortabel med.

Nå er det dags for produksjon.

Skriv-utgang "$ Fornavn $ Etternavn $ Prefix- $ Suffix"}

Dette er ganske mye så enkelt som det blir i skriptet. Den utsender bare for- og etternavnet skilt av mellomrom, deretter et annet mellomrom før telefonnummeret. Her er hvor standard dash mellom Exchange Code og Subscriber ID blir lagt til også.

Den lukkebraketten nederst er slutten av ForEach-Object-sløyfen fra tidligere - utelat dette hvis du allerede har det.

Del 5: Opprydding og kjøring av skriptet

Etter alt arbeidet er gjort, vet et godt skript hvordan man rydder opp etter seg selv. Igjen, er det ikke nødvendig å variabel fjerning nedenfor hvis du bare skal kjøre skriptet fra konsollen, men du vil ønske det hvis du planlegger å kjøre det i ISE.

Remove-Item-alias: \ g Fjern-Variabel ScriptFolder, RequiredFiles, Etternavn, Mann, Fornavn, NummerFormat, Prefiks, Suffiks, ValidInput, UserInput

Når du har gjort alt, lagre manuset med en ".ps1" forlengelsei samme mappe som dine navnefiler. Sørg for at ExecutionPolicy er satt slik at skriptet kan kjøre, og gi det en virvel.

Her er et skjermbilde av skriptet i handling:

Du kan også laste ned en ZIP-fil som inneholder dette PowerShell-skriptet og tekstfiler med navnelister, fra lenken nedenfor.

Tilfeldig navn &Telefonnummer Generator for PowerShell