Koduleht » kuidas » Kuidas luua juhuslikke nimesid ja telefoninumbreid PowerShelliga

    Kuidas luua juhuslikke nimesid ja telefoninumbreid PowerShelliga

    Kui vajate testimiseks või demonstreerimiseks vajalikku andmekogumit ja see peab esindama isiklikult tuvastatavat teavet (PII), ei soovi te üldjuhul kasutada tegelikke andmeid, mis esindavad tegelikke inimesi. Siin läheme teid läbi, kuidas saate PowerShelli abil luua juhuslike nimede ja telefoninumbrite loendi just sellisel juhul.

    Mida sa vajad

    Enne alustamist on mõned vahendid ja teave, mis teil peaks olema:

    PowerShell

    See skript töötati välja PowerShell 4.0 abil ning seda on testitud ka ühilduvuse tagamiseks PowerShell 2.0-ga. PowerShell 2.0 või uuem versioon on Windows 7 sisseehitatud alates Windows 7-st. See on saadaval ka Windows XP ja Vista jaoks osana Windows Management Frameworkist (WMF). Allpool on mõned täiendavad üksikasjad ja lingid allalaadimiseks.

    • Windows XP SP3 ja Vista (SP1 või uuemad) kasutajad saavad alla laadida Microsoftilt sobiva WMF-versiooni KB968929-s. Seda ei toetata XP SP2 või alla selle või Vista ilma SP1-ga.
    • PowerShell 4.0 on varustatud Windows 8.1-ga. Windows 7 SP1 kasutajad saavad seda alla laadida Microsofti allalaadimiskeskuse WMF-värskenduse osana. See ei ole saadaval XP või Vista puhul.

    Nimed

    Sul on vaja mõningaid nimesid, mida juhuslikku generaatorisse sisestada. Suurepärane allikas a palju nimed ja teave nende populaarsuse kohta (kuigi seda ei kasutata selle skripti jaoks), on Ameerika Ühendriikide rahvaloendamise büroo. Allolevatel linkidel olevad nimekirjad on väga suured, nii et võiksite neid veidi kärpida, kui plaanite korraga luua palju nimesid ja numbreid. Meie testisüsteemis võtsid kõik nimed / numbripaarid täielike nimekirjade loomiseks aega umbes 1,5 sekundit, kuid teie läbisõit varieerub sõltuvalt teie süsteemi spetsifikatsioonidest.

    • Perekonnanimed
    • Meeste esimesed nimed
    • Naine esimesed nimed

    Sõltumata kasutatavast allikast peate genereerima kolm tekstifaili, mida skript saab oma nime valimiseks kasutada basseinidena. Iga fail peaks sisaldama ainult nimesid ja ainult ühe nime rea kohta. Need tuleb salvestada samasse kausta nagu PowerShelli skript.

    Perekonnanimed.txt peaks sisaldama perekonnanime, mida soovite skripti valida. Näide:

    Smith Johnson Williams Jones Brown

    Males.txt peaks sisaldama isasnimesid, kellele skript peaks valima. Näide:

    James John Robert Michael

    Females.txt peaks sisaldama naissoost nimesid, mida soovite skripti valida. Näide:

    Mary Patricia Linda Barbara Elizabeth

    Telefoninumbrite reeglid

    Kui soovite olla kindel, et teie telefoninumbrid ei vasta kellegi reaalsele telefoninumbrile, on kõige lihtsam viis kasutada tuntud „555” Exchange'i koodi. Aga kui sa näitad palju telefoninumbreid sisaldavat andmekogumit, hakkab 555 hakkama päris monotoonseks reaalseks. Selleks, et asjad muutuksid huvitavamaks, genereerime teisi telefoninumbreid, mis rikuvad Põhja-Ameerika numeratsiooniplaani (NANP) reegleid. Allpool on mõned kehtetute telefoninumbrite näidised, mis esindavad iga skripti poolt genereeritud numbri klassi:

    • (157) 836-8167
      See number on kehtetu, sest Area Codes ei saa alustada 1 või 0-ga.
    • (298) 731-6185
      See number on kehtetu, kuna NANP ei anna piirkonnakoode 9-ga teise numbrina.
    • (678) 035-7598
      See number on kehtetu, sest Exchange'i koodid ei saa algusega 1 või 0.
    • (752) 811-1375
      See number on kehtetu, sest Exchange'i koodid ei saa lõppeda kahe 1-ga.
    • (265) 555-0128
      See number on vale, sest Exchange'i kood on 555, ja abonendi tunnus on fiktiivsete numbrite jaoks reserveeritud vahemikus.
    • (800) 555-0199
      See number on ainus 800 number 555 Exchange'i koodiga, mis on reserveeritud kasutamiseks fiktiivse numbrina.

    Pange tähele, et ülaltoodud reeglid võivad muutuda ja võivad sõltuvalt jurisdiktsioonist erineda. Peaksite tegema oma uuringuid, et kontrollida kehtivaid reegleid, mida kohaldatakse selle piirkonna suhtes, mille jaoks te telefoninumbreid genereerite.

    Ühised käsud

    Selle skripti puhul kasutatakse mõningaid üsna tavalisi käske, nii et peate saama põhiideed selle kohta, mida need tähendused enne selle tegelikku kirjutamist sukelduvad.

    • Eelmine objekt võtab vastu objektide massiivi või nimekirja ja täidab igaüks neist määratud toimingu. ForEach-Object-skripti plokis kasutatakse muutuja $ _, et viidata töödeldavale elemendile.
    • kui ... mujal avaldused võimaldavad teil toimingut täita ainult siis, kui teatud tingimused on täidetud, ja (valikuliselt) täpsustada, mida tuleks teha, kui see tingimus ei ole täidetud.
    • lüliti avaldused on sarnased, kui avaldused rohkem valikuid. Lüliti kontrollib objekti mitme tingimuse suhtes ja käivitab mis tahes skriptiplokid, mis on objektile sobivate tingimuste jaoks määratud. Võite soovi korral määrata ka vaikeploki, mis käivitub ainult siis, kui ühtegi muud tingimust ei ole sobitatud. Lüliti avaldused kasutavad ka $ _ muutujat, et viidata praegusele töödeldavale elemendile.
    • samal ajal avaldused võimaldavad teil skripti blokeerida pidevalt korrata, kui teatud tingimus on täidetud. Kui midagi juhtub, mis põhjustab, et skriptiploki lõpetamisel ei ole tingimus enam tõene, väljub silmus.
    • proovige… püüda avaldused aitavad vigade käsitlemisel. Kui proovile määratud skriptiplokiga midagi läheb valesti, siis käivitub püügiplokk.
    • Saada sisu teeb seda, mida ta tina kohta ütleb. See saab määratud objekti sisu - tavaliselt faili. Seda saab kasutada tekstifaili sisu kuvamiseks konsoolis või, nagu käesolevas käsiraamatus, edastama sisu mööda torujuhet, mida kasutatakse koos teiste käskudega.
    • Kirjutage-host paneb kraami konsooli. Seda kasutatakse kasutajale sõnumite esitamiseks ja see ei sisaldu skripti väljundis, kui väljund suunatakse.
    • Kirjutusväljund tegelikult toodab väljundit. Tavaliselt laaditakse see konsooli, kuid seda saab suunata ka teiste käskude abil.

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

    Skripti loomine

    Nüüd on aeg meie käed määrdunud.

    1. osa

    Kui soovid, et skript käivituks puhtast konsoolist, on siin esimene, mida soovite.

    Clear-Host

    Nüüd, kui meil on puhas ekraan, on järgmine asi, mida me tahame teha, et skript kontrolliks, kas kõik, mis tal on vaja, on olemas. Selleks peame alustama, öeldes, kust otsida ja mida otsida.

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

    Esimene rida on väga kasulik iga skripti jaoks. See määratleb muutuja, mis osutab skripti sisaldavale kaustale. See on hädavajalik, kui teie skript vajab muid faile, mis asuvad samas kataloogis (või selle kataloogi teadaoleva suhtelise teega), sest muidu tekib viga, kui proovite skripti käivitada, kui olete teises töö kataloog.

    Teine rida loob hulga failinimesid, mis on vajalikud skripti korrektseks töötamiseks. Me kasutame seda koos $ ScriptFolder muutujaga järgmises tükis, kus me kontrollime, kas need failid on olemas.

    $ RequiredFiles | ForEach-Object if (! (Test-tee "$ ScriptFolder $ _")) Write-Host "$ _ ei leitud." -ForegroundColor Punane $ MissingFiles ++

    See skriptipunkti saadab $ RequiredFiles massiivi ForEach-Object plokki. Selle skripti bloki puhul kasutab if-avaldus Test-Path-i, et näha, kas otsitav fail on see, kuhu see kuulub. Test-Path on lihtne käsk, mis failiraja andmisel tagastab tõelise või vale vastuse, et öelda meile, kas tee viitab olemasolevale. Hüüumärk on a mitte operaator, mis tühistab test-tee vastuse, enne kui edastate selle avaldusele. Nii et kui Test-Path tagastab vale (st faili, mida otsime, ei ole olemas), teisendatakse see tõeks, nii et kui avaldus täidab selle skripti bloki.

    Siin on veel üks märkus, mida selles käsikirjas sageli kasutatakse, on ühekordsete jutumärkide asemel kahekordse hinnapakkumise kasutamine. Kui paned midagi ühekaupa, kohtleb PowerShell seda staatilise stringina. Ükskõik, mis on üksikutes hinnapakkumistes, edastatakse täpselt nii nagu on. Double-quotes ütleb PowerShellile, et tõlkida muutujad ja mõned muud spetsiaalsed elemendid stringis enne selle läbimist. Siin tähendavad kahekordsed jutumärgid selle asemel jooksmist Test-tee '$ ScriptFolder' $ _ '  me teeme midagi enamat Test-tee 'C: skriptid Perekonnanimed.txt' (eeldades, et teie skript on C: Skriptid ja ForEach-Object töötab praegu 'Perekonnanimed.txt').

    Iga faili kohta, mida pole leitud, kirjutab kirjast-host punase veateate, et öelda teile, milline fail puudub. Seejärel suurendab see $ MissingFiles muutujat, mida kasutatakse järgmises tükis, et viga ja lõpetada, kui failid puuduvad.

    kui ($ MissingFiles) Write-Host "Ei leidnud $ MissingFiles lähtefaili (faile). -ForegroundColor punane eemaldatav muutuja skripti kaust, nõutavad failid, puuduvad failid väljuvad

    Siin on veel üks puhas trikk, mida saate teha, kui avaldused. Enamik juhendeid näevad, kas avaldused näitavad, et kasutate operaatorit, et kontrollida vastavuse tingimusi. Näiteks võiksime siin kasutada kui ($ MissingFiles -gt 0) et näha, kas $ MissingFiles on suurem kui null. Kui aga kasutate juba käske, mis tagastavad loogilise väärtuse (nagu eelmises plokis, kus me kasutasime test-rada), ei ole see vajalik. Seda saab teha ka sellistel juhtudel, kui te lihtsalt katsetate, kas number ei ole null. Igasugust nullnumbrit (positiivset või negatiivset) käsitletakse tõesena, samas kui null (või, nagu siin võib juhtuda, olematu muutuja) käsitletakse valena.

    Kui $ MissingFiles on olemas ja see ei ole null, siis kirjutab host-sõnum teile, kui palju faile on puudu ja et skript katkestatakse. Seejärel puhastab eemaldatav muutuja kõik teie loodud muutujad ja väljumine lõpetab skripti. Tavalises PowerShelli konsoolis ei ole Eemaldatav muutuja seda konkreetset eesmärki tegelikult vaja, sest skriptide poolt määratud muutujad jäetakse tavaliselt skriptist välja. Kuid PowerShelli ISE käitub veidi erinevalt, et võiksite seda säilitada, kui plaanite sealt skripti käivitada.

    Kui kõik asjad on korras, jätkub skript. Veel üks ettevalmistus on varjunimi, mille pärast on meil väga hea meel.

    Uus-Alias ​​g Get-Random

    Varjunimede abil luuakse käskudele alternatiivseid nimesid. Need võivad olla kasulikud, et aidata meil uut liidest tutvuda (nt PowerShellil on sisseehitatud varjunimed dir -> Get-ChildItem ja kass -> Get-Content) või teha lühiajalisi viiteid üldkasutatavatele käskudele. Siin me teeme väga lühikese käega viide Get-Random käsk, mida hiljem palju kasutatakse.

    Get-Random teeb päris palju seda, mida tema nimi tähendab. Arvestades massiivi (nagu nimede loend) sisendina, valib see massiivist juhusliku elemendi ja sülitab selle välja. Seda saab kasutada ka juhuslike numbrite loomiseks. Samas tuleb meeles pidada, et Get-Random ja numbrid on nagu paljud teised arvuti operatsioonid, mis algab loendamisest nullist. Nii et mitte Get-Random 10 see tähendab, et mida loomulikum on „anna mulle number 1–10”, tähendab see tegelikult „andke mulle numbrit vahemikus 0 kuni 9.” Saate olla täpsem numbrivaliku kohta, nii et Get-Random käitub rohkem kui loomulikult oodata, kuid me ei vaja seda selles skriptis.

    2. osa: kasutaja sisend ja tööle minek

    Kuigi skript, mis genereerib vaid ühe juhusliku nime ja telefoninumbri, on suur, on palju parem, kui skript võimaldab kasutajal määrata, mitu nime ja numbrit nad soovivad ühes partiis saada. Kahjuks ei saa me tõesti usaldada kasutajaid alati andma õiget sisendit. Niisiis, siin on natuke rohkem kui lihtsalt $ UserInput = Read-Host.

    samas (! $ ValidInput) try [int] $ UserInput = Read-Host -Prompt "Koostatavad elemendid" $ ValidInput = $ true catch Write-Host "Kehtetu sisend. Sisestage ainult number. ' -ForegroundColor Red

    Ülaltoodud avaldus kontrollib ja tühistab väärtuse $ ValidInput. Niikaua kui $ ValidInput on vale või seda ei eksisteeri, jätkab see oma skripti blokeerimist.

    Proovimise avaldus võtab kasutaja sisestuse Read-Hosti kaudu ja üritab selle konverteerida täisarvuks. (See ongi [int] Kui see on edukas, seab see väärtuse $ ValidInput väärtuseks tõeseks, nii et samasugune silmus saab väljuda. Kui see ei õnnestu, siis postitab blokeerimisblokk vea ja kuna $ ValidInput ei saanud seadistust, pöördub samasugune silmus ümber ja küsib kasutajat uuesti.

    Kui kasutaja on sisendina numbri nõuetekohaselt andnud, siis tahame, et skript teataks, et see hakkab tegelikkuses oma tööd tegema ja seejärel tegema seda..

    Write-Host "'nGenerating $ UserInput nimed ja telefoninumbrid. Palun ole kannatlik.'n" 1… $ UserInput | ForEach-Object 

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

    Kirjutus-host-rida on üsna lihtne. See ütleb lihtsalt, kui palju nimesid ja telefoninumbreid skript hakkab genereerima, ning palub kasutajal olla kannatlik, kui skript töötab. Thestringi alguses ja lõpus on tühja rea ​​sisestamine enne ja pärast seda väljundit, et anda talle visuaalne eraldus sisendjoone ja nimede ja numbrite loendi vahel. Pange tähele, et see on tagakülg (AKA „haud aktsent” - tavaliselt klahv üleval, vasakul pool 1) ja mitte apostroof või üksiku tsitaat igaühele n.

    Järgmine osa näitab teistsugust viisi, mida saab kasutada ForEach-Object-silmus. Tavaliselt, kui soovite skripti blokeerida teatud arvu kordi, seadistate tavalise kontuuri nagu jaoks ($ x = 1; $ x -le $ UserInput; $ x ++) . ForEach-Object võimaldab meil seda lihtsustada, kandes selle täisarvude loendisse ja selle asemel, et öelda, et ta tegelikult nende täisarvudega midagi teeb, anname sellele lihtsalt staatilise skripti ploki, mis kestab kuni täisarvudeni, et seda teha.

    3. osa: Juhusliku nime genereerimine

    Nime loomine on ülejäänud protsessi kõige lihtsam. See koosneb ainult kolmest etapist: perekonnanime valimine, soo valimine ja eesnime valimine. Pea meeles, et alias, mille me kaua aega tagasi saime Get-Randomi jaoks? Aeg hakata seda kasutama hakama.

        $ Surname = Sisu saamine "$ ScriptFolder" Perekonnanimed.txt " g $ Male = g 2, kui ($ Male) $ FirstName = Get-Content "$ ScriptFolder \ t g else $ FirstName = Get-Content "$ ScriptFolder \ t g

    Esimene rida võtab meie perekonnanimede nimekirja, sisestab selle juhusliku valijale ja määrab valitud nime $ Surname.

    Teine rida valib meie inimese soo. Pea meeles, kuidas Get-Random hakkab loendama nullist ja kuidas null on vale ja kõik muu on tõsi? Nii me kasutame Get-Random 2 (või palju lühem g 2 tänu meie varjunimele - mõlemad annavad võimaluse valida nulli või ühe vahel, et otsustada, kas meie isik on mees või mitte. Pärast seda, kui avaldus pärast seda valitakse, valitakse juhuslikult mees- või naissoost eesnimi.

    4. osa: Juhusliku telefoninumbri genereerimine

    Siin on tõesti lõbus osa. Varem näitasime teile, kuidas on mitmel moel võimalik kehtetu või fiktiivne telefoninumber teha. Kuna me ei taha, et kõik meie numbrid näeksid üksteisele liiga sarnased, valime iga kord juhuslikult vale numbriformaadi. Juhuslikult valitud vormingud määratletakse nende suunakoodide ja Exchange'i koodide abil, mis salvestatakse ühiselt $ Prefix.

        $ NumberFormat = g 5 lüliti ($ NumberFormat) 0 $ Prefix = "($ (g 2) $ (g 10) $ (g 10)) $ (g 10) $ (g 10) $ (g 10)"  1 $ prefiks = "($ (g 10) 9 $ (g 10)) $ (g 10) $ (g 10) $ (g 10)" 2 $ prefiks = "($ (g 10) $ (g 10) $ (g 10)) $ (g 2) $ (g 10) $ (g 10) " 3 $ prefiks =" ($ (g 10) $ (g 10) $ (g 10)) $ (g 10) 11 " 4 $ prefiks =" ($ (g 10) $ (g 10) $ (g 10)) 555 "

    Esimene rida on lihtne juhuslik numbrite genereerimine, et valida, millist vormingut telefoninumbri järgi järgime. Seejärel võtab lüliti avaldus selle juhusliku valiku ja genereerib vastavalt $ prefiksi. Pea meeles selle kehtetute telefoninumbrite nimekirja? $ NumberFormat väärtused 0-3 vastavad esimesele neljale selles nimekirjas. Väärtus 4 võib luua ühe kahest viimasest, kuna mõlemad kasutavad Exchange'i koodi „555”.

    Siin näete ka, et me kasutame topeltnoteeringuga teist trikki. Kahekordsed jutumärgid ei lase teil muutujaid enne stringi väljundit tõlgendada - nad võimaldavad ka skriptiplokkide töötlemist. Selleks mähkige skriptiplokk selliseks: „$ ()”. Niisiis, mida teil on ülal, on palju individuaalselt randomiseeritud numbreid, millest mõned on piiratud nende vahemikus või staatiliselt vastavalt reeglitele, mida peame järgima. Igal stringil on ka sulgud ja vahekaugus, nagu tavaliselt eeldad, et näeksid seda piirkonna koodis ja Exchange'i koodipaaris.

    Viimane asi, mida peame tegema enne meie nime ja telefoninumbri väljastamist, on luua abonendi ID, mis salvestatakse $ Suffix.

        lüliti ($ NumberFormat) $ _ -lt 4 $ Suffix = "$ (g 10) $ (g 10) $ (g 10) $ (g 10)" 4 lüliti ($ prefiks) '( 800) 555 '$ Suffix =' 0199 ' vaikimisi $ Suffix = "01 $ (g 10) $ (g 10)"

    555 numbri jaoks kehtivate erieeskirjade tõttu ei saa me iga nelja juhusliku numbri genereerida iga telefoninumbri jaoks, mida meie skript teeb. Nii kontrollib esimene lüliti, kas me tegeleme 555 numbriga. Vastasel juhul tekitab see neli juhuslikku numbrit. Kui see on 555 number, kontrollib teine ​​lüliti 800 suunakoodi. Kui see sobib, siis on võimalik kasutada ainult ühte kehtivat $ sufiksi. Vastasel juhul on lubatud valida midagi 0100-0199 vahel.

    Pange tähele, et selle ploki kirjutamise viis on selle asemel, kuidas seda on. Mõlemad lülitusavaldused oleksid võinud asendada if / other avaldustega, kuna nad mõlemad käitavad ainult kahte valikut. Lisaks sellele oleks võinud kasutada „vaikimisi”, mitte „4” väljavalimist esimese lülitusavalduse valikuks, nagu seda tehti ka teises, kuna see oli ainus vasakpoolne valik. Valik, kas valida, kas / / vs vs lüliti, või millal kasutada vaikimisi märksõna konkreetsete väärtuste asemel, langeb sageli isikliku eelistuseni. Niikaua kui see töötab, kasutage seda, mida sa kõige rohkem naudid.

    Nüüd on aeg väljundiks.

        Kirjutusväljund "$ FirstName $ Perekonnanimi $ prefiks- $ sufiks"

    See on päris nii lihtne, kui see skripti saab. See väljastab ainult ees- ja perekonnanime, mis on eraldatud tühikutega, seejärel teise numbri ees. Siin on lisatud ka standardkriips Exchange'i koodi ja abonendi ID vahel.

    See allosas olev sulgur on ForEach-Object loop'i lõpp, mis on varasemast - jätke see välja, kui olete selle juba saanud.

    5. osa: skripti puhastamine ja käivitamine

    Pärast seda, kui kõik tööd on tehtud, teab hea skript, kuidas end ise puhastada. Jällegi ei ole allpool olev muutuja eemaldamine tõesti vajalik, kui skripti käivitatakse ainult konsoolilt, kuid te soovite seda, kui kavatsete seda ISE-s käivitada..

    Eemalda-üksus varjunimi: g Eemalda muutuva skripti kaust, nõutavad failid, perekonnanimi, isane, eesnimi, numberFormat, prefiks, sufiks, validInput, kasutaja sisend

    Pärast seda, kui see kõik on tehtud, salvestage skript ".ps1" laiendiga samasse kausta nagu nimefailid. Veenduge, et teie ExecutionPolicy on seatud nii, et skript saab käivitada ja anda sellele keerise.

    Siin on toimiva skripti pilt:

    Allolevast lingist saate alla laadida ka selle PowerShelli skripti sisaldava ZIP-faili ja nimenimekirjadega tekstifaile.

    Juhuslik nimi ja telefoninumber generaator PowerShelli jaoks