Kuidas juhuslikke nimesid ja telefoninumbreid PowerShelliga genereerida

Sisukord:

Kuidas juhuslikke nimesid ja telefoninumbreid PowerShelliga genereerida
Kuidas juhuslikke nimesid ja telefoninumbreid PowerShelliga genereerida
Anonim
Kui teil on vaja testimiseks või tutvustamiseks mõeldud andmekogumit ja see komplekt peab esindama isiklikult tuvastatavat teavet (PII), ei soovi üldiselt üldse tegelikke andmeid, mis esindavad tegelikke inimesi. Siin tutvustame teile, kuidas saate PowerShelli kasutada selleks, et genereerida juhuslike nimede ja telefoninumbrite loend just selliseks sündmuseks.
Kui teil on vaja testimiseks või tutvustamiseks mõeldud andmekogumit ja see komplekt peab esindama isiklikult tuvastatavat teavet (PII), ei soovi üldiselt üldse tegelikke andmeid, mis esindavad tegelikke inimesi. Siin tutvustame teile, kuidas saate PowerShelli kasutada selleks, et genereerida juhuslike nimede ja telefoninumbrite loend just selliseks sündmuseks.

Mida sa vajad

Enne alustamist on teil mõned tööriistad ja teave, mida peaks olema:

PowerShell

See skript töötati välja PowerShell 4.0-ga ja seda on testitud ka PowerShell 2.0-ga ühilduvuse kohta. PowerShell 2.0 või uuem versioon on Windowsis sisseehitatud alates Windows 7-st. Samuti on see Windows XP ja Vista jaoks saadaval Windows Management Framework (WMF) osana. Järgmised üksikasjad ja allalaadimiste lingid on allpool.

  • PowerShell 2.0 on varustatud Windows 7-ga. Windows XP SP3 ja Vista (SP1 või uuemad) kasutajad saavad Microsoftilt KB968929 vastava WMF-i versiooni allalaadida. Seda ei toeta XP SP2 või allpool või Vista ilma SP1ta.
  • PowerShell 4.0-l on Windows 8.1. Windows 7 SP1 kasutajad saavad seda Microsofti allalaadimiskeskusest WMF-i värskenduse osana uuendada. See pole saadaval XP või Vista jaoks.

Nimed

Teil on vaja mõnda nimede loendit juhusliku generaatori söötmiseks. Suurepärane allikas a palju nimesid ja teavet nende populaarsuse kohta (kuigi seda ei kasutata selle skripti jaoks) on Ameerika Ühendriikide loendusbüroo. Allolevatel linkidel olevad loendid on väga suured, nii et võite soovida neid natuke ümber lõigata, kui plaanite luua korraga palju nimesid ja numbreid. Meie katsesüsteemis võtsid kõik nimede / numbrite paarid täielike loendite loomiseks umbes 1,5 sekundit, kuid teie läbisõit varieerub sõltuvalt teie enda süsteemi spetsifikatsioonidest.

  • Perekonnanimed
  • Mehed Esimesed nimed
  • Naise eesnimed

Sõltumata kasutatavast allikast tuleb teil luua kolm tekstifaili, mida skript saab nime valimisel kasutada basseinidena. Iga fail peaks sisaldama ainult nimesid ja ainult ühte nime rea kohta. Neid tuleb salvestada PowerShelli skriptiga samas kaustas.

Perekonnanimed.txt peaks sisaldama perekonnanimesid, mida skript valida soovite. Näide:

Smith Johnson Williams Jones Brown

Males.txt peaks sisaldama meeste eesnimesid, mida skript valida soovite. Näide:

James John Robert Michael William

Females.txt peaks sisaldama naiste eesnimesid, mida skript valida soovite. Näide:

Mary Patricia Linda Barbara Elizabeth

Telefoninumbrite reeglid

Kui soovite olla kindel, et teie telefoninumbrid ei vasta kellegi reaalsele telefoninumbrile, on lihtsaim viis kasutada tuntud "555" vahetuskoodi. Kuid kui hakkate näitama hulga telefoninumbritega andmekomplekti, hakkab see 555 päris monotoonne reaalajas kiiresti nägema. Asjade huvitavamaks muutmiseks genereerime teisi telefoninumbreid, mis rikuvad Põhja-Ameerika numbrimiskava (NANP) eeskirju. Allpool on mõned valed telefoninumbrid, mis esindavad iga klassi numbrit, mis genereeritakse selle skripti abil:

  • (157) 836-8167 See number on kehtetu, kuna piirkonnakoode ei saa alata 1 või 0-ga.
  • (298) 731-6185 See number on kehtetu, kuna NANP ei anna pindalasid 9-ga teise numbrini.
  • (678) 035-7598 See number on kehtetu, kuna Exchange'i koodid ei saa alata 1 või 0-ga.
  • (752) 811-1375 See number on kehtetu, kuna Exchange'i koodid ei saa lõpetada kahe 1-ga.
  • (265) 555-0128 See number on kehtetu, kuna Exchange'i kood on 555, ja tellija ID on fiktiivsete numbrite jaoks reserveeritud vahemikus.
  • (800) 555-0199 See number on ainus 800 number, mille 555 vahetuskoodeks on reserveeritud kasutamiseks fiktiivse numbrina.

Pange tähele, et ülaltoodud eeskirjad võivad muutuda ja need võivad jurisdiktsioonis erineda. Te peaksite tegema oma uurimistööd, et kontrollida kehtivaid eeskirju, mis kehtivad selle lingi jaoks, mille jaoks teete telefoninumbreid.

Ühised käsud

Sellel skriptil on kavas kasutada üsna tavalisi käske, nii et peaksite põhijooni sellest, mida need tähendavad, enne kui me sukeldume selle kirja panemiseks.

  • Iga-Objekti jaoks võtab objektide massiivi või nimekirja ja täidab määratud toiminguid igale neist. ForEach-Objekti skriptiploki puhul kasutatakse $ _ muutuja, mis viitab käimasolevale objektile, mida töödeldakse.
  • kui … muidu avaldused võimaldavad teil toiminguid teostada ainult siis, kui on täidetud teatavad tingimused ja (vajadusel) täpsustatakse, mida tuleks teha, kui seda tingimust ei täideta.
  • lülita avaldused on nagu suurema valiku avaldused. Lüliti kontrollib objekti mitmete tingimuste vastu ja käivitab kõik skriptikloodid tingimustele, mida objekt vastab. Samuti võite valikuliselt määrata vaikeploki, mis käivitub ainult siis, kui ühtegi muud tingimust ei sobi. Määra lülitite avaldused kasutavad ka $ _ -muudat, mis viitab käimasolevale objektile, mida töödeldakse.
  • samal ajal avaldused võimaldavad teil skriptikloke pidevalt korrata nii kaua, kui on täidetud teatud tingimus. Kui midagi juhtub, mis põhjustab tingimuse, et skriptikeel on lõpetatud, ei ole see enam õige, siis loop väljub.
  • proovige … saagi avaldused aitavad vea käsitlemisel. Kui proovitüki jaoks määratud skriptiplokk läheb valesti, käivitatakse püügiplokk.
  • Get-sisu kas see, mida see tina ütleb.See saab kindla objekti sisu - tavaliselt faili. Seda saab kasutada konsooli tekstifaili sisu kuvamiseks või selle skripti kaudu mööda gaasijuhtme sisu, mida kasutada koos teiste käskudega.
  • Write-Host paneb asju konsooli. Seda kasutatakse kasutajale sõnumite esitamiseks ja see ei kuulu skripti väljundisse, kui väljundit suunatakse ümber.
  • Kirja väljund tegelikult genereerib toodangu. Tavaliselt laaditakse see konsooli alla, kuid seda saab suunata ka teiste käskude abil.

Skriptis on teisi käske, kuid me selgitame neid nii nagu me läheme.

Script loomine

Nüüd on aeg oma käed räpane saada.

1. osa: valmisolek minema

Kui sulle meeldib sinu skript puhta konsooli käivitamiseks, siis siin on esimene rida, mida soovite.

Clear-Host

Nüüd, kui meil on puhas ekraan, on järgmine asi, mida me tahame teha, on skriptikontroll, et veenduda, et kõik, mis seda vajab, on paigas. Selleks peate alustama, rääkides, kust seda vaadata ja mida otsida.

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

Esimene rida on igale skriptile väga kasulik. See määrab muutuja, mis viitab skripti sisaldavale kausta. See on hädavajalik, kui teie skript vajab teisi faile, mis asuvad samas kataloogis ise (või selle kataloogi teadaolevat suhtelist rada), kuna muidu ilmnevad vead, kui proovite skripti käivitada, kui olete teises töökataloog.

Teine rida loob mitmesuguseid failinimesid, mis on skripti õigesti töötamiseks vajalikud. Me kasutame seda koos $ ScriptFolder muutujaga järgmises töös, kus kontrollime, kas need failid on olemas.

$RequiredFiles | ForEach-Object { if (!(Test-Path '$ScriptFolder$_')) { Write-Host '$_ not found.' -ForegroundColor Red $MissingFiles++ } }

See skriptiosa saadab $ RequiredFilesi massiivi ForEach-Objekti plokki. Selles skriptiblokis kasutab IF-aruanne Test-Pathi, et näha, kas otsitav fail on see, kuhu see kuulub. Test-tee on lihtne käsk, mis faili tee loomisel tagastab tõese või vale vastuse, mis meile räägib, kui tee osutab midagi, mis on olemas. Hüüumärk on seal mitte operaator, mis muudab test-tee reageeringu, enne kui see edastatakse if-avaldusele. Nii et kui Test-Path tagastab vale (see tähendab, et otsitavat faili ei eksisteeri), teisendatakse see trueks, nii et IF-avaldus käivitab selle skriptikloki.

Teine asi, mida siinkohal märkida, mida selles skriptis sageli kasutatakse, on topeltotsimiste kasutamine ühe hinnapakkumiste asemel. Kui paned midagi ühe hinnapakkumisi, siis käsitleb PowerShell seda staatilise stringina. Ükskõik, mis ühes hinnapakkumistes on, viiakse täpselt nii nagu on. Topeltkvoodid ütlevad PowerShellile muutujate ja mõnede muude stringi tõlkimiseks enne selle möödu mist. Siin tähendab topelt-hinnapakkumisi, et jooksu asemel Test-tee '$ ScriptFolder $ _' me tegelikult teeme midagi rohkemat Test-tee 'C: Skriptid Perekonnanimed.txt' (eeldades, et teie skript on C: Skriptidel ja ForEach-Object töötab praegu "Surnames.txt").

Kui iga faili pole leitud, kirjutab hostija veateade punasega, mis annab teile teada, milline fail on puudu. Seejärel suurendab järjestikune $ MissingFiles muutuja, mida kasutatakse järgmises tükis, viga ja lõpetage failide puudumine.

if ($MissingFiles) { Write-Host 'Could not find $MissingFiles source file(s). Aborting script.' -ForegroundColor Red Remove-Variable ScriptFolder,RequiredFiles,MissingFiles Exit }

Siin on veel üks puhas trikk, mida saate teha avaldustega. Enamik juhendeid näete, kas avaldused ütlevad sulle, et kasutaksite vastava tingimuse kontrollimiseks operaatorit. Näiteks siin võiksime kasutada kui ($ MissingFiles -gt 0) kas $ MissingFiles on suurem kui null. Siiski, kui kasutate juba käske, mis tagastab loogilise väärtuse (nagu eelmises plokis, kus kasutasime Test-Path), pole see vajalik. Seda saab teha ka ilma selleta sellistel juhtudel, kui proovite lihtsalt kontrollida, kas number ei ole null. Iga mitte-nullinumbrit (positiivne või negatiivne) loetakse tõeks, kuid null (või, nagu siin võib juhtuda, olematu muutuja) käsitletakse kui valet.

Kui $ MissingFiles eksisteerib ja ei ole null, kirjutab hostija sõnum, mis ütleb sulle, kui palju faile on kadunud ja skript katkestatakse. Seejärel eemaldab eemaldatav muutuja kõik välja töötatud muutujad ja Exit sulgub skripti. Regulaarsel PowerShelli konsoolil ei ole Remove-Variable jaoks selle konkreetse eesmärgi jaoks tegelikult vajalik, sest skriptide poolt määratud skriptide muutujad jäetakse välja. Kuid PowerShell ISE käitub veidi teisiti, nii et võite seda säilitada, kui kavatsete skripti käivitamiseks sealt käitada.

Kui kõik asjad on korras, jätkatakse skripti. Veel üks ettevalmistus teha on alias, mille pärast me tõesti rõõmustame.

New-Alias g Get-Random

Aliase kasutatakse käskude jaoks alternatiivsete nimede loomiseks. Need võivad olla kasulikud uuele liidesele tutvustamiseks (nt PowerShellil on sisseehitatud varjunimed nagu dir -> Get-ChildItem ja kass -> Get-sisu) või üldkasutatavate käskude lühikirjalised viited. Siin me teeme väga lühiülevaade Get-Random käsk, mida hakatakse kasutama palju hiljem.

Get-Random päris palju muudab selle, mida selle nimi viitab. Arvestades massiivi (nt nimede loendit) sisendina, valib ta massiivist juhusliku elemendi ja vallandab selle välja. Seda saab kasutada ka juhuslike numbrite genereerimiseks. Hübriidide ja numbrite meeles pidamine on see, et see, nagu paljudel teistel arvutioperatsioonidel, hakkab nulli lugema. Nii asemel Get-Random 10 mis tähendab seda, et loomulikum "andke mulle number 1-10", tähendab see tõepoolest "andke mulle number 0-9". Võite täpsemalt rääkida numbrivalikust, nii et Get-Random käitub rohkem nagu natuke ootame, kuid me ei vaja seda skripti.

2. osa: kasutajate sisestamine ja tööle asumine

Kuigi skript, mis genereerib vaid üht juhuslikku nime ja telefoninumbrit, on suurepärane, on palju parem, kui skript võimaldab kasutajal määrata, kui palju nimesid ja numbreid nad soovivad ühte partiisse saada. Kahjuks ei saa me tõesti usaldada kasutajatele alati õiget sisendit. Nii et seal on väike natuke rohkem kui lihtsalt $ 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 } }

Kuid ülalnimetatud avaldus kontrollib ja tühistab väärtuse $ ValidInput. Kui $ ValidInput on vale või ei eksisteeri, jätkab see skriptikloki kaudu loopimist.

Proovipäring võtab kasutaja sisendiga läbi Read-Host'i ja üritab seda teisendada terviklikuks väärtuseks. (See on [int] enne Read-Host'i.) Kui see on edukas, määrab see väärtuse $ ValidInput tõele, nii et samal ajal loop saab väljuda. Kui see ei õnnestu, kuvatakse saagi blokeerimisel viga ja kuna $ ValidInput ei saanud seatud, pöördub ajalt silmus ümber ja palub kasutaja uuesti.

Kui kasutaja on õigesti sisestanud numbri sisendina, soovime, et skript teataks, et ta hakkab tegelikult oma tööd tegema ja seejärel hakkab seda tegema.

Write-Host '`nGenerating $UserInput names & phone numbers. Please be patient.`n' 1..$UserInput | ForEach-Object { <# INSERT RANDOM NAME & NUMBER GENERATOR HERE #> }

Ärge muretsege, me ei kavatse jätta teid ise, et välja selgitada juhusliku nime ja numbri genereerija kood. See on lihtsalt kohahoidja kommentaar, mis näitab teile, kuhu järgmine sektsioon (kus tegelik töö tehakse) sobib.

Write-Hosti rida on üsna lihtne. See lihtsalt ütleb, kui palju nimesid ja telefoninumbreid skript hakkab genereerima, ning palub kasutajal olla kannatlik, kuni skript töötab. The`nstringi alguses ja lõpus on sisestada tühimärk enne ja pärast väljundit, vaid selleks, et anda sisendjoone ja nimede ja numbrite loendi vahel visuaalne lahusus. Pidage meeles, et see on tagakärss (AKA "hauaklokk" - tavaliselt võtme kohal olev vahekaart, vasakul pool 1) ja mitte ükskõik kummardus n.

Järgmine osa näitab teisiti, kuidas võite kasutada ForEach-Objekti silmust. Tavaliselt, kui soovite, et skript blokeeriks teatud arvu kordi, seadistatakse regulaarselt loop-like jaoks ($ x = 1; $ x -le $ UserInput; $ x ++) {<# INSERT SCRIPT HERE #>}.ForEach-Object võimaldab meil seda lihtsustada, lisades selle täisarvude loetelusse, selle asemel, et öelda, et ta kasutab tegelikult neid täisarvu, vaid anname sellele staatilise skriptikloke, et see käivituks, kuni see täisarvudest välja jookseb.

3. osa: juhusliku nime genereerimine

Nime genereerimine on selle protsessi ülejäänud osa lihtsaim natuke. See koosneb ainult kolmest etapist: perekonnanimi, soo valimine ja eesnimi valimine. Pidage meeles, et mõni aeg tagasi andisime varem Get-Randomi nimel tagasi? Aeg hakata seda kasutama hakata.

$Surname = Get-Content '$ScriptFolderSurnames.txt' | g $Male = g 2 if ($Male) {$FirstName = Get-Content '$ScriptFolderMales.txt' | g} else {$FirstName = Get-Content '$ScriptFolderFemales.txt' | g}

Esimene rida võtab meie perekonnanimede loendi, toidab selle juhusliku valijaga ja määrab valitud nime $ perekonnanimele.

Teine rida valib meie inimese soo. Pea meeles, kuidas Get-Random hakkab loendama nulli ja kuidas null on vale ja kõik muu on tõene? Seda me kasutame Get-Random 2 (või palju lühem g 2 tänu meie nimele - mõlemad põhjustavad valikut nulli või ühe vahel), et otsustada, kas meie inimene on meessoost või mitte. Kui / else avaldus valib seejärel juhuslikult mehe või naise nime vastavalt.

Osa 4: juhusliku telefoninumbri loomine

Siin on tõesti lõbus osa. Varem me näitasime teile, kuidas on mitmel moel võimalik teha vale või fiktiivset telefoninumbrit. Kuna me ei soovi, et kõik meie numbrid oleksid liiga sarnased üksteisega, valime juhuslikult vale numbrivormingu iga kord. Juhuslikult valitud vormingud määratletakse nende piirkonnakoode ja valuutakoodiga, mida hoitakse kollektiivselt $ prefiksina.

$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'} }

Esimene rida on otsene juhuslik arv põlvkond, et valida, millist vormingut telefoninumbri järgi järgime. Seejärel lülitab avaldus välja juhusliku valiku ja genereerib vastavalt $ prefiksi. Pea meeles, et kehtetute telefoninumbrite tüüpide nimekiri? $ NumberFormat väärtused 0-3 vastavad selle loendi esimesele neljale. Väärtus 4 võib luua ühe kahest viimasest, kuna mõlemad kasutavad vahetuskoodi 555.

Siin näete ka seda, et kasutame topelt-hinnapakkumisi kasutades mõnda muud trikki. Topelt-hinnapakkumised ei lase teil tõlgendada muutujaid enne, kui string väljub - need võimaldavad teil ka skriptiklokeid töödelda. Selleks panete skriptiklahvi selliselt: "$ (<# SCRIPT HERE #>)". Nii et ülaltoodud on palju individuaalselt randomiseeritud numbreid, kusjuures mõned neist on kas piiratud nende vahemikus või seatud staatiliselt vastavalt eeskirjadele, mida peame järgima. Igal stringil on ka sulgudes ja vahekaugusena, mida tavaliselt peaksite vaatama piirkonnakoodis ja Exchange-koodide paaris.

Viimane asi, mida peame tegema, enne kui oleme valmis oma nime ja telefoninumbri väljastama, on luua Subscriber ID, mida hoitakse $ 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)'} } } }

555-numbrite erieeskirjade tõttu ei saa me lihtsalt luua neli juhuslikku numbrit iga telefoninumbri lõpus, mida meie skript kavatseb teha. Nii et esimene lüliti kontrollib, kas me tegeleme 555-ga. Kui ei, siis see genereerib neli juhuslikku numbrit. Kui see number on 555, kontrollib teine lüliti 800 suunakoodi.Kui see sobib, on ainult üks kehtiva $ Suffix, mida saame kasutada. Vastasel juhul on sellel lubatud midagi valida 01.00-0199.

Pidage meeles, et selle ploki võib olla kirjutatud mitmel erineval viisil, selle asemel, et see oleks. Mõlemad lülitusaruanded oleksid võinud asendada avaldustega / else, kuna need ainult käsitlevad kahte valikut. Selle asemel, et spetsiaalselt välja kutsuda "4" esimese lüliti avalduse valikuvõimalusena, oleks võinud kasutada vaikimisi samamoodi, nagu see oli tehtud teises, kuna see oli ainus võimalus jäänud. Valiku vahel, kas / else vs switch või kus kasutada vaikimisi märksõnu konkreetsete väärtuste asemel, tehakse sageli isiklikke eelistusi. Niikaua kui see töötab, kasutage seda, mis teile kõige rohkem meeldib.

Nüüd on aeg väljundiks.

Write-Output '$FirstName $Surname $Prefix-$Suffix' }

See on üsna lihtne, kui see skripti saab. See lihtsalt väljastab ees- ja perekonnanime tühikutega ja seejärel teise numbriga enne telefoninumbrit. Siin on koht, kus lisatakse vahetuskoodi ja abonendi ID vaheline standardne sidekriips.

See altpoolt olev sulgemisklamber on ForEach-Objekti loopi lõpp varasemast - jätke see välja, kui olete seda juba saanud.

5. osa: skripti puhastamine ja käitamine

Kui kõik töö on tehtud, oskab hea skript end ise puhastada. Veelgi enam, allpool olev muutuja eemaldamine pole tegelikult vajalik, kui kavatsete skripti ainult konsoolis käivitada, kuid soovite seda, kui olete kunagi plaaninud selle käitada ISE-is.

Remove-Item alias:g Remove-Variable ScriptFolder,RequiredFiles,Surname,Male,FirstName,NumberFormat,Prefix,Suffix,ValidInput,UserInput

Kui olete kõik selle teinud, salvestage skript laiendiga ".ps1" samasse kataloogi kui teie nimedefailid. Veenduge, et teie ExecutionPolicy on seatud nii, et skript suudab käivitada ja anda sellele keerdu.

Siin on skripti ekraanipilt tegevuses:

Võite alla laadida ka ZIP-faili, mis sisaldab seda PowerShell-skripti, ja nimesidentidega tekstifaile allpool olevast lingist.
Võite alla laadida ka ZIP-faili, mis sisaldab seda PowerShell-skripti, ja nimesidentidega tekstifaile allpool olevast lingist.

PowerShelli juhuslik nimi ja telefoninumbri generaator

Soovitan: