Hjemmeside » hvordan » Slik genererer du tilfeldige navn og telefonnumre med PowerShell

    Slik genererer du tilfeldige navn og telefonnumre med PowerShell

    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 bare en slik anledning.

    Hva trenger du

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

    Kraftskall

    Dette skriptet ble utviklet ved hjelp av PowerShell 4.0, og har også blitt testet for kompatibilitet med PowerShell 2.0. PowerShell 2.0 eller nyere er innebygd i Windows siden Windows 7. Den er også tilgjengelig for Windows XP og Vista som en del av Windows Management Framework (WMF). Noen ytterligere detaljer, og koblinger 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.
    • PowerShell 4.0 leveres med Windows 8.1. Windows 7 SP1-brukere kan oppgradere til den som en del av en WMF-oppdatering fra Microsoft Download Center. Det er ikke tilgjengelig for XP eller Vista.

    navnene

    Du trenger noen lister med navn for å mate inn i tilfeldig generator. En flott kilde til a mye av navn og informasjon om populariteten deres (selv om det ikke vil bli brukt til dette skriptet), er USAs folketrykkskonto. Lister som er tilgjengelige på linkene under er veldig 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
    • Mannens fornavn
    • Kvinne Fornavn

    Uansett hvilken kilde 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.

    Surnames.txt bør inneholde etternavnene du vil at skriptet skal velge fra. Eksempel:

    Smith Johnson Williams Jones Brown

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

    James John Robert Michael William

    Females.txt bør 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 virkelig raskt. 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 Codes 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-ID 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 lokalområdet 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 faktisk.

    • 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 ... annet uttalelser tillater deg kun å utføre en operasjon dersom visse betingelser er oppfylt, og (valgfritt) angi hva som skal gjøres når tilstanden ikke er oppfylt.
    • bytte om uttalelser er som om uttalelser 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.
    • samtidig som uttalelser tillater deg å kontinuerlig gjenta en skriptblokk så lenge en bestemt betingelse er oppfylt. Når noe skjer som forårsaker at tilstanden ikke lenger er sant når manuset er ferdig, utløper sløyfen.
    • prøv ... fange uttalelser hjelp med feilhåndtering. Hvis noe går galt med skriptblokken som er oppgitt for forsøk, vil fangstblokken løpe.
    • Get-innhold 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 Host setter ting i konsollen. Dette brukes til å presentere meldinger til brukeren, og er ikke inkludert i skriptets utgang hvis utdataene blir omdirigert.
    • Skrive Output faktisk genererer 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.

    Bygg skriptet

    Nå er det på tide å få våre hender 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-vert

    Nå som vi har en ren skjerm, er det neste som vi ønsker å gjøre, å få skriptet til å kontrollere at alt det trenger er på plass. For å gjøre det, må vi først begynne å 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 alle skript. 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 annen arbeidskatalog.

    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 sjekker for at disse filene er til stede.

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

    Denne delen av skriptet sender $ RequiredFiles-arrayet til en ForEach-Object-blokk. Innenfor denne skriptblokken bruker if-setningen Test-Sti 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-banen før den overføres til if-setningen. Så hvis test-banen returnerer false (det vil si filen vi leter etter eksisterer ikke), vil den bli konvertert til ekte, slik at if-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. Doble sitater forteller PowerShell å oversette variablene og noen andre spesielle elementer i strengen før de overføres. Her betyr dobbeltkvitene det i stedet for å kjøre Test-Sti '$ ScriptFolder \ $ _'  Vi vil faktisk gjøre noe mer som Test-Sti 'C: \ Skript \ Etternavn.txt' (forutsatt at skriptet ditt er i C: \ Scripts, og ForEach-Object jobber for tiden med '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 Fjern-Variabel 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 der 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 er ikke-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 falsk.

    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 manuset 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 å lage alternative navn for 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 -> Få innhold) eller å lage korte referanser for vanlig brukte kommandoer. Her lager vi en veldig kort referanse for Get-Random kommando 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 gruppen 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 hadde naturlig Forvent, men vi trenger ikke det i dette skriptet.

    Del 2: Få brukerinngang og arbeid

    Mens et skript som genererer bare ett tilfeldig navn og telefonnummer er flott, er det mye bedre hvis manuset lar brukeren angi hvor mange navn og nummer de vil få i en batch. Dessverre kan vi ikke virkelig 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 nummer. ' -ForegroundColor Red

    Denne 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 den er vellykket, vil den 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 er i ferd med å begynne å faktisk gjøre sitt arbeid og deretter få det til å gjøre det.

    Skriv-Host "'nGenerere $ UserInput navn og telefonnumre. Vær vær tålmodig.'n" 1 ... $ UserInput | ForEach-Object 

    Ikke bekymre deg, vi kommer ikke til å forlate deg på egen hånd for å finne ut tilfeldig navn og nummergeneratorkode. 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 skriptet gjør sitt arbeid. De'n i begynnelsen og slutten av strengen er å sette inn en tom linje før og etter den utmatingen, bare for å gi den litt visuell adskillelse mellom inngangslinjen og listen over navn og tall. Vær oppmerksom på at det er en back-tick (AKA "grave aksent" - vanligvis nøkkelen over fanen, 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 ha en skriptblokk for å kjøre et bestemt antall ganger, vil du sette opp en vanlig for sløyfe som for ($ x = 1; $ x -le $ UserInput; $ x ++) . ForEach-Object lar oss forenkle dette ved å mate det med en liste med heltall, og i stedet for å fortelle det å faktisk gjøre noe med disse heltallene, gir vi det 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

    Å generere 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.

        $ Surname = 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 tildeler det valgte navnet til $ Etternavn.

    Den andre linjen velger personens kjønn. Husk hvordan Get-Random begynner å telle fra null, og hvordan null er feil og alt annet er sant? Slik bruker vi Tilfeldig 2 (eller det mye kortere g 2 takket være vårt alias - begge gir et valg mellom null eller en) for å avgjøre om personen er mannlig 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.

        $ (G 10) $ (g 10) $ (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 format vi 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 samsvarer med 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 nytt triks med dobbelthender. Dobbelkvoter lar deg ikke bare tolke variabler før en streng får utdata - de lar deg også behandle skriptblokker. For å gjøre det, bryter du skriptblokken slik: “$ ()”. 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 ville forvente å se i et kode for et kode og et Exchange Code.

    Det siste vi må gjøre før vi er klare til å utføre vårt navn og telefonnummer, er å generere en abonnent-ID, som vil bli lagret som $ Suffix.

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

    På grunn av de spesielle reglene for 555 tall, kan vi ikke bare generere fire tilfeldige tall for slutten av hvert telefonnummer som skriptet vårt 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, sjekker 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.

    Legg merke til at det er noen forskjellige måter denne blokken kunne ha blitt skrevet, i stedet for hvordan 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 tid for utdata.

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

    Dette er ganske enkelt så enkelt som det blir i skriptet. Det 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 avsluttende braketten 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.

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

    Når du har gjort alt, lagre manuset med en ".ps1" -utvidelse i samme mappe som navnene dine. 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 linken nedenfor.

    Tilfeldig navn og telefonnummergenerator for PowerShell