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 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.
- 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.
navnene
Du trenger noen lister med navn for å mate inn i tilfeldig generator. En god kilde til a mye av navn, og informasjon om deres popularitet (selv om det ikke vil bli brukt til dette skriptet), er USAs folkeavgiftsbyrå. 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
- 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 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 Codes ikke kan begynne med en 1 eller 0.
- (752) 811-1375 Dette nummeret er ugyldig fordi Exchange Codes ikke kan avsluttes med to 1s.
- (265) 555-0128 Dette nummeret er ugyldig fordi Exchange-koden er 555, og Abonnent ID er innenfor rekkevidde 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 … annet uttalelser 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.
- 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 scriptblokk 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, går sløyfen ut.
- prøv … fange uttalelser hjelp med feilhåndtering. Hvis noe går galt med skriptblokken som er oppgitt for prøve, 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 utdata hvis utgangen 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å hendene skitne.
Del 1: Gjør deg klar til å gå
Hvis du vil 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 som 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-Path $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 ditt 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 kontrollerer at filene er til stede.
$RequiredFiles | ForEach-Object { if (!(Test-Path '$ScriptFolder$_')) { Write-Host '$_ not found.' -ForegroundColor Red $MissingFiles++ } }
Denne delen av skriptet 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-banen er en enkel kommando som, når den er gitt 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), 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 det i stedet for å kjøre Test-Path '$ ScriptFolder $ _' Vi vil faktisk gjøre noe mer som Test-Sti 'C: Skript Etternavn.txt' (forutsatt at skriptet 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 deg 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.
if ($MissingFiles) { Write-Host 'Could not find $MissingFiles source file(s). Aborting script.' -ForegroundColor Red Remove-Variable ScriptFolder,RequiredFiles,MissingFiles Exit }
Her er et annet pent trick du kan gjøre med om 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 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.
New-Alias g Get-Random
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 -> 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 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 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 stole på at brukerne alltid skal gi gyldig innspilling. Så det er en liten bit mer til dette enn bare $ UserInput = Read-Host.
while (!$ValidInput) { try { [int]$UserInput = Read-Host -Prompt 'Items to be generated' $ValidInput = $true } catch { Write-Host 'Invalid input. Enter a number only.' -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 det er vellykket, 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 inntasting, 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 names & phone numbers. Please be patient.`n' 1..$UserInput | ForEach-Object { <# INSERT RANDOM NAME & NUMBER GENERATOR HERE #> }
Ikke bekymre deg, vi kommer ikke til å forlate deg alene for å finne ut tilfeldig navn og nummergenerator 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. De`nved begynnelsen og slutten av strengen er det å 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 loop som for ($ x = 1; $ x -le $ UserInput; $ x ++) {<# INSERT SCRIPT HERE #>}.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 det bare en statisk skriptblokk for å løpe til den går tom for 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 '$ScriptFolderSurnames.txt' | g $Male = g 2 if ($Male) {$FirstName = Get-Content '$ScriptFolderMales.txt' | g} else {$FirstName = Get-Content '$ScriptFolderFemales.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 det mye kortere g 2 takket være vårt alias - begge gir et valg mellom null eller en) for å avgjøre om personen vår 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.
$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'} }
Den første linjen er en enkel tilfeldig generasjon 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 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 nytt 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: "$ (<# SCRIPT HERE #>)". 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 å utføre vårt navn og telefonnummer, er å generere en abonnent-ID, som vil bli lagret som $ Suffix.
switch ($NumberFormat) { {$_ -lt 4} {$Suffix = '$(g 10)$(g 10)$(g 10)$(g 10)'} 4 { switch ($Prefix) { '(800) 555' {$Suffix = '0199'} default {$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, 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.
Merk at det er noen forskjellige måter denne blokken kunne ha vært 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.
Write-Output '$FirstName $Surname $Prefix-$Suffix' }
Dette er ganske enkelt 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 avsluttende braketten nederst er slutten av ForEach-Object-løkken 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 ha det hvis du planlegger å kjøre det i ISE.
Remove-Item alias:g Remove-Variable ScriptFolder,RequiredFiles,Surname,Male,FirstName,NumberFormat,Prefix,Suffix,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:
Tilfeldig navn og telefonnummergenerator for PowerShell