Úvodná » ako » Ako generovať náhodné mená a telefónne čísla pomocou PowerShell

    Ako generovať náhodné mená a telefónne čísla pomocou PowerShell

    Keď potrebujete súbor údajov na testovanie alebo demonštráciu a táto množina musí reprezentovať osobné identifikovateľné informácie (PII), spravidla nechcete používať skutočné údaje, ktoré reprezentujú skutočných ľudí. Tu vás budeme informovať, ako môžete použiť funkciu PowerShell na generovanie zoznamu náhodných mien a telefónnych čísel pre takúto príležitosť.

    Čo potrebuješ

    Skôr ako začnete, máte k dispozícii niektoré nástroje a informácie, ktoré by ste mali mať:

    PowerShell

    Tento skript bol vyvinutý pomocou programu PowerShell 4.0 a bol tiež testovaný na kompatibilitu s PowerShell 2.0. PowerShell 2.0 alebo novší bol v systéme Windows vstavaný od Windows 7. Je tiež dostupný pre systémy Windows XP a Vista ako súčasť Windows Management Framework (WMF). Ďalšie podrobnosti a odkazy na prevzatie sú uvedené nižšie.

    • PowerShell 2.0 je dodávaný so systémom Windows 7. Používatelia Windows XP SP3 a Vista (SP1 alebo novší) môžu stiahnuť príslušnú verziu WMF od spoločnosti Microsoft v KB968929. Nie je podporovaný v systéme XP SP2 alebo nižšie, alebo Vista bez SP1.
    • PowerShell 4.0 je dodávaný so systémom Windows 8.1. Používatelia systému Windows 7 SP1 môžu na ňu inovovať ako súčasť aktualizácie WMF zo Strediska pre prevzatie softvéru spoločnosti Microsoft. Nie je k dispozícii pre XP alebo Vista.

    mená

    Budete potrebovať nejaké zoznamy mien, ktoré sa majú pridať do náhodného generátora. Skvelý zdroj pre veľa názvov a informácií o ich popularite (aj keď to nebude použité pre tento skript), je americký sčítanie ľudu Bureau. Zoznamy, ktoré sú k dispozícii na nižšie uvedených odkazoch, sú veľmi veľké, takže ich možno budete chcieť trochu ozdobiť, ak plánujete vytvoriť veľa mien a čísel naraz. Na našom testovacom systéme každý pár / pár pár trval približne 1,5 sekundy, aby sme mohli vygenerovať úplné zoznamy, ale vaše najazdené kilometre sa líšia v závislosti od vlastných systémových špecifikácií.

    • priezvisko
    • Mužské prvé mená
    • Prvé mená žien

    Bez ohľadu na zdroj, ktorý používate, budete musieť generovať tri textové súbory, ktoré môže skript použiť ako databázy na výber jeho názvu. Každý súbor by mal obsahovať iba mená a len jeden názov na riadok. Tieto musia byť uložené v rovnakom priečinku ako skript PowerShell.

    Surnames.txt by mali obsahovať priezviská, od ktorých chcete skript vyberať. Príklad:

    Smith Johnson Williams Jones Brown

    Males.txt by mali obsahovať mená, z ktorých chcete skript vybrať. Príklad:

    James John Robert Michael

    Females.txt by mali obsahovať mená, z ktorých chcete skript vyberať. Príklad:

    Mary Patricia Linda Barbara Elizabeth

    Pravidlá pre telefónne čísla

    Ak chcete mať istotu, že vaše telefónne čísla nezodpovedajú skutočnému telefónnemu číslu nikoho, najjednoduchším spôsobom je použiť dobre známy Exchange Code (555). Ak však chcete zobraziť súbor dát s množstvom telefónnych čísel, začne 555 začať vyzerať celkom monotónne. Ak chcete urobiť veci zaujímavejšie, vygenerujeme ďalšie telefónne čísla, ktoré porušujú pravidlá pre severoamerický číslovací plán (NANP). Nižšie sú uvedené niektoré vzorové neplatné telefónne čísla, ktoré predstavujú každú triedu čísiel, ktoré budú generované týmto skriptom:

    • (157) 836-8167
      Toto číslo je neplatné, pretože oblasť kódy nemôže začať s 1 alebo 0.
    • (298) 731-6185
      Toto číslo je neplatné, pretože NANP nepriraďuje kódy oblastí s číslom 9 ako druhú číslicu.
    • (678) 035-7598
      Toto číslo je neplatné, pretože kódy Exchange nemôžu začínať číslom 1 alebo 0.
    • (752) 811-1375
      Toto číslo je neplatné, pretože Exchange kódy nemôžu skončiť s dvoma 1s.
    • (265) 555-0128
      Toto číslo je neplatné, pretože kód Exchange je 555, a ID účastníka je v rozsahu rezervovanom pre fiktívne čísla.
    • (800) 555-0199
      Toto číslo je jediným číslom 800 s číselným kódom 555, ktorý je vyhradený na použitie ako fiktívne číslo.

    Upozorňujeme, že vyššie uvedené pravidlá podliehajú zmenám a môžu sa líšiť podľa jurisdikcie. Mali by ste urobiť svoj vlastný prieskum na overenie súčasných pravidiel, ktoré sa vzťahujú na miestne nastavenie, pre ktoré budete vytvárať telefónne čísla.

    Bežné príkazy

    Existujú niektoré pomerne bežné príkazy, ktoré sa budú používať v celom tomto skripte, takže by ste mali získať základnú predstavu o tom, čo to znamenajú skôr, než sa ponoríme do skutočného písania.

    • Foreach-Object prevezme pole alebo zoznam objektov a vykoná danú operáciu na každom z nich. V rámci bloku skriptov ForEach-Object sa premenná $ _ používa na označenie aktuálnej položky, ktorá sa spracováva.
    • ak ... inak príkazy vám umožňujú vykonávať operáciu iba vtedy, ak sú splnené určité podmienky a (voliteľne) špecifikujte, čo treba urobiť, ak táto podmienka nie je splnená.
    • prepínač vyhlásenia sú akoby vyhlásenia s viacerými voľbami. Prepínač skontroluje objekt v niekoľkých podmienkach a spustí akékoľvek bloky skriptov, ktoré sú určené pre podmienky, ktoré sa zhodujú s objektom. Môžete tiež voliteľne zadať predvolený blok, ktorý sa bude spúšťať iba vtedy, ak sa nezodpovedajú žiadne ďalšie podmienky. Príkazy pre prepínanie tiež používajú premennú $ _ na odvolanie sa na aktuálnu spracovanú položku.
    • zatiaľ čo príkazy umožňujú priebežne opakovať blok skriptu, pokiaľ je splnená určitá podmienka. Akonáhle sa stane niečo, čo spôsobí, že podmienka už nie je pravdivá po dokončení bloku skriptu, ukončí sa slučka.
    • Skús chytiť výpisy pomáhajú pri manipulácii s chybami. Ak sa niečo pokazí s blokom skriptu určeným na pokus, bude spustený blok úlovku.
    • Get-Content robí to, čo hovorí na plechovke. Získaný obsah určeného objektu - zvyčajne súbor. Toto sa dá použiť na zobrazenie obsahu textového súboru na konzole, alebo ako v tomto skripte prechádza obsah pozdĺž potrubia, ktorý sa má použiť s inými príkazmi.
    • Write-hostiteľ dáva veci do konzoly. Používa sa na prezentovanie správ používateľovi a nie je zahrnutý do výstupu skriptu, ak sa výstup presmeruje.
    • Write-Output v skutočnosti generuje výstup. Za normálnych okolností sa toto dá do konzoly, ale môže byť presmerované aj inými príkazmi.

    V skripte sú aj ďalšie príkazy, ale vysvetlíme ich, ako ideme.

    Vytváranie skriptu

    Teraz je čas strhnúť naše ruky.

    Časť 1: Pripravte sa na cestu

    Ak sa vám páči skript, aby sa spustil beh z čistej konzoly, tu je prvý riadok, ktorý chcete v ňom.

    Clear-hostiteľskej

    Teraz, keď máme čistú obrazovku, ďalšia vec, ktorú chceme urobiť, je skontrolovať skript a uistiť sa, že všetko, čo potrebuje, je na mieste. Aby sme to mohli urobiť, musíme začať tým, že povieme, kam sa pozrieť a čo hľadať.

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

    Prvý riadok je veľmi užitočný pre každý skript. Definuje premennú, ktorá ukazuje na priečinok obsahujúci skript. Toto je nevyhnutné, ak váš skript potrebuje iné súbory, ktoré sú umiestnené v tom istom adresári ako sám o sebe (alebo známa relatívna cesta z tohto adresára), pretože inak sa vyskytnú chyby, ak a keď sa pokúsite spustiť skript, pracovný adresár.

    Druhý riadok vytvorí pole názvov súborov, ktoré sú potrebné na správne fungovanie skriptu. Použijeme to spolu s premennou $ ScriptFolder v ďalšom diele, kde skontrolujeme, či sú tieto súbory prítomné.

    $ RequiredFiles | ForEach-Object if (! (Test-Path "$ ScriptFolder \ $ _")) Správa-Host "$ _ nenašiel." -ForegroundColor Červená $ MissingFiles ++

    Tento kus skriptu pošle pole $ RequiredFiles do bloku ForEach-Object. V rámci daného bloku skriptov príkaz if používa cestu testovania, či súbor, ktorý hľadáme, je miesto, kam patrí. Cesta testovania je jednoduchý príkaz, ktorý pri zadaní cesty k súboru vráti základnú pravú alebo falošnú odpoveď, aby nám povedal, či cesta ukazuje na niečo, čo existuje. Výkričník tam je a nie operátor, ktorý predtým, ako ho odovzdá príkaz if, zvráti odpoveď testovacej cesty. Takže ak Test-Path vráti falošný (to znamená, že súbor, ktorý hľadáme, neexistuje), bude konvertovaný na true tak, že príkaz if vykoná svoj blok skriptu.

    Ďalšia vec, ktorú si tu všimnite, ktorá sa bude často používať v tomto skripte, je použitie dvojitých úvodzoviek namiesto jednoznačkových úvodzoviek. Keď vložíte niečo do jednoduchých úvodzoviek, PowerShell to považuje za statický reťazec. Čokoľvek, čo je v jednotlivých citáciách, prechádza presne tak, ako je. Dvojité kotácie informujú PowerShell, že prenesú premenné a niektoré ďalšie špeciálne položky do reťazca predtým, než ich odovzdajú. Tu dvojitá ukážka znamená, že namiesto spustenia Skúšobná cesta '$ ScriptFolder \ $ _'  budeme vlastne robiť niečo viac Skúšobná cesta "C: \ Scripts \ Surnames.txt" (za predpokladu, že váš skript je v C: \ Scripts a ForEach-Object práve pracuje na 'Surnames.txt').

    Pre každý súbor, ktorý sa nenašiel, zapisuje správca príspevku červené chybové hlásenie, ktoré vám povie, ktorý súbor chýba. Potom sa zvyšuje premenná $ MissingFiles, ktorá sa použije v ďalšom kuse, chyba a skončí, ak chýbajú nejaké súbory.

    ak ($ ​​MissingFiles) Write-Host "sa nepodarilo nájsť zdrojový súbor $ MissingFiles. -ForegroundColor Červená Odstrániť-premenná ScriptFolder, RequiredFiles, MissingFiles Exit

    Tu je ďalší úhľadný trik, ktorý môžete urobiť s vyhláseniami. Väčšina sprievodcov vám uvidí o tom, či vyhlásenia vám povedia, aby ste použili operátora na skontrolovanie zodpovedajúcej podmienky. Napríklad tu môžeme použiť ak ($ ​​MissingFiles -gt 0) či $ MissingFiles je väčšia ako nula. Ak však už používate príkazy, ktoré vrátia booleovskú hodnotu (ako v predchádzajúcom bloku, kde sme používali Cesta testovania), nie je to potrebné. Môžete tak urobiť aj v takýchto prípadoch, keď práve testujete, či je číslo nenulové. Akékoľvek nenulové číslo (kladné alebo záporné) sa považuje za pravdivé, zatiaľ čo nula (alebo, ako sa môže stať, neexistujúca premenná) bude považovaná za nepravdivú.

    Ak $ MissingFiles existuje a nie je nula, Write-Host uverejní správu o tom, koľko súborov chýbajú a že skript preruší. Potom Remove-Variable vyčistí všetky premenné, ktoré sme vytvorili a Exit ukončí skript. Na bežnej konzole PowerShell nie je pre tento konkrétny účel potrebná funkcia Odstránenie premennej, pretože premenné nastavené skripty sa zvyčajne vyradia po ukončení skriptu. Napriek tomu PowerShell ISE sa správa trochu inak, takže by ste to chceli nechať, ak máte v pláne spustiť skript odtiaľ.

    Ak je všetko v poriadku, skript bude pokračovať. Ešte jedna príprava je alias, že budeme naozaj radi, že budeme mať neskôr.

    Nový alias g Get-Random

    Aliasy sa používajú na vytvorenie alternatívnych názvov príkazov. Môžu nám pomôcť oboznámiť sa s novým rozhraním (napr .: PowerShell má vstavané aliasy ako dir -> Get-ChildItem a mačka -> Získajte obsah) alebo urobiť krátke odkazy pre bežne používané príkazy. Tu robíme veľmi krátky odkaz pre Get-Random príkaz, ktorý sa oveľa neskôr použije.

    Get-Random veľa robí to, čo naznačuje jeho názov. Vzhľadom na pole (ako zoznam názvov) ako vstup, vyberie náhodnú položku z poľa a vypliesie to. Môže sa použiť aj na generovanie náhodných čísel. Čo treba pamätať na Get-Random a čísla, je to, že rovnako ako mnohé iné počítačové operácie, začína počítať od nuly. Takže namiesto toho Get-Random 10 čo znamená viac prirodzené "dajte mi číslo od 1 do 10" to naozaj znamená "dajte mi číslo od 0 do 9." Môžete byť konkrétnejší na výber čísla, takže Get-Random sa správa viac, ako ste prirodzene očakávame, ale v tomto scenári to nepotrebujeme.

    Časť 2: Získanie vstupov používateľov a začatie práce

    Zatiaľ čo skript, ktorý generuje len jedno náhodné meno a telefónne číslo, je skvelé, je skôr lepšie, ak skript umožňuje používateľovi určiť, koľko mien a čísel chce dostať v jednej dávke. Bohužiaľ nemôžeme skutočne dôverovať používateľom, aby vždy dali platný vstup. Takže je tu o niečo viac než len $ UserInput = Read-Host.

    zatiaľ čo (! $ ValidInput) try [int] $ UserInput = Čítať-Host -Prompt 'položky, ktoré sa majú generovať' $ ValidInput = $ true catch Write-Host ' Zadajte iba číslo. " -Predbarevné červené farby

    Vyššie uvedené vyhlásenie skontroluje a odmieta hodnotu $ ValidInput. Tak dlho, kým je $ ValidInput nepravdivé alebo neexistuje, bude pokračovať v blokovaní bloku skriptov.

    Skúšobný príkaz preberá užívateľský vstup cez Read-Host a pokúša sa ho previesť na celočíselnú hodnotu. (To je [Int] pred Read-Host.) Ak je to úspešné, nastaví hodnotu $ ValidInput na hodnotu true tak, aby cyklica while mohla opustiť. Ak to nie je úspešné, blok chyby uverejní chybu a pretože $ ValidInput sa nezostavil, cyklo while sa vráti a opätovne vyzve užívateľa.

    Keď používateľ správne zadal číslo ako vstup, chceme, aby skript oznámil, že práve začne svoju prácu začať a potom sa o tom robí.

    Write-Host "'nGenerácia $ UserInput mená a telefónne čísla. Buďte trpezliví.n" 1 ... $ UserInput | ForEach-Object 

    Nebojte sa, nechceme vás opustiť sami, aby ste zistili kód generátora náhodných čísel a čísel. To je len poznámka zástupného symbolu, ktorá vám ukáže, kde sa bude nachádzať ďalšia sekcia (kde sa uskutoční skutočná práca).

    Riadok Write-Host je veľmi jednoduchý. Jednoducho hovorí, koľko mien a telefónnych čísiel skript vygeneruje, a vyzýva používateľa, aby bol trpezlivý, zatiaľ čo skript pracuje.na začiatku a na konci reťazca sa má vložiť prázdny riadok pred a po tomto výstupe, len aby sa dal určitý vizuálny odstup medzi vstupnou líniou a zoznamom mien a čísel. Majte na pamäti, že to je spätný tick (AKA "hlboký prízvuk" - zvyčajne ten kľúč nad tabuľkou, vľavo od 1) a nie apostrof alebo single-quote pred každým n.

    Nasledujúca časť ukazuje iný spôsob, ako môžete použiť slučku ForEach-Object. Typicky, ak chcete, aby bol blok skriptu spustený niekoľkokrát, nastavíte si pravidelnú slučku pre ($ x = 1; $ x -le $ UserInput; $ x ++) . ForEach-Object nám umožňuje zjednodušiť to tak, že mu prinášame zoznam celých čísel a namiesto toho, aby sme mu povedali, že skutočne urobí niečo s týmito celistvami, dáme mu len statický blok skriptu, ktorý beží, kým sa nevyčerpá celé čísla, aby to urobil.

    Časť 3: Generovanie náhodného mena

    Generovanie názvu je najjednoduchší bit zvyšku tohto procesu. Skladá sa iba z troch krokov: vyberanie priezviska, vyberanie pohlavia a vyberanie krstného mena. Pamätajte si, že alias sme urobili pre Get-Random späť? Čas začať používať to.

        $ Priezvisko = Získajte obsah "$ ScriptFolder \ Surnames.txt" g $ Muž = g 2 ak ($ ​​Muž) $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" | g iný $ FirstName = Get-Content "$ ScriptFolder \ Females.txt" g

    Prvý riadok preberá náš zoznam priezvisk, vloží ho do náhodného výberu a priradí zvolené meno k priezvisku $.

    Druhý riadok vyberá pohlavie našej osoby. Pamätajte si, ako začne počítať Get-Random od nuly a ako je nula falošná a všetko ostatné je pravdivé? Tak to používame Get-Random 2 (alebo oveľa kratšie g 2 vďaka nášmu aliasu - obe majú za následok voľbu medzi nulou alebo jednou), aby sme sa rozhodli, či je naša osoba mužská alebo nie. Príkaz if / else následne náhodne vyberie menom alebo ženským krstným menom zodpovedajúcim spôsobom.

    Časť 4: Generovanie náhodného telefónneho čísla

    Tu je naozaj zábavná časť. Predtým sme vám ukázali, ako je niekoľko spôsobov, ako môžete vytvoriť neplatné alebo fiktívne telefónne číslo. Keďže nechceme, aby všetky naše čísla vyzerali príliš podobne, budeme náhodne vybrať neplatný formát čísel zakaždým. Náhodne zvolené formáty budú definované podľa kódu oblasti a kódu Exchange, ktorý bude spoločne uložený ako predpona $.

        $ NumberFormat = g 5 prepínač ($ NumberFormat) 0 $ Prefix = "($ (g 2) $ (g 10) $ (g 10)  1 $ Prefix = "($ (g 10) 9 $ (g 10)) $ (g 10) $ (g 10) $ (g 10) (g 10) $ (g 2) $ (g 2) $ (g 10) $ (g 10) " 3 $ Prefix =" $ (g 10) 11 " 4 $ Prefix =" ($ (g 10) $ (g 10) $ (g 10)

    Prvý riadok je priamočiare generovanie náhodných čísel na výber formátu, ktorý budeme sledovať pre telefónne číslo. Následne príkaz switch prevezme túto náhodnú voľbu a zodpovedajúcim spôsobom generuje predponu $. Nezabudnite, že zoznam neplatných typov telefónnych čísel? Hodnoty $ NumberFormat 0-3 zodpovedajú prvým štyrom v tomto zozname. Hodnota 4 môže vygenerovať jeden z posledných dvoch, pretože obe používajú Exchange Code "555".

    Tu môžete tiež vidieť, že používame ďalší trik s dvojitými úvodzovkami. Dvojité kotácie neumožňujú len interpretáciu premenných pred výstupom reťazca - umožňujú vám tiež spracovanie skriptových blokov. Ak chcete urobiť, zabalíte blok skriptu takto: "$ ()". Takže to, čo máte vyššie, je veľa individuálne randomizovaných číslic, pričom niektoré z nich sú buď obmedzené alebo sú staticky nastavené podľa pravidiel, ktoré musíme dodržiavať. Každý reťazec má taktiež zátvorky a medzery, ako by ste normálne očakávali v dvojmiestnom kóde a kóde Exchange Code.

    Posledná vec, ktorú musíme urobiť predtým, než budeme pripravené na vytlačenie nášho mena a telefónneho čísla, je vytvoriť ID účastníka, ktorý bude uložený ako prípona $.

        prepínač ($ NumberFormat) $ _ -lt 4 $ Suffix = "$ (g 10) $ (g 10) $ (g 10) 800) 555 '$ Suffix =' 0199 ' predvolené $ Suffix = "01 $ (g 10) $ (g 10)"

    Z dôvodu špeciálnych pravidiel pre 555 čísel nemôžeme generovať len štyri náhodné číslice na konci každého telefónneho čísla, ktoré bude náš skript robiť. Takže prvý prepínač skontroluje, či ide o číslo 555. Ak nie, generuje štyri náhodné číslice. Ak je to číslo 555, druhý prepínač skontroluje 800-miestny kód. Ak sa to zhoduje, existuje len jeden platný príp. $ Suffix, ktorý môžeme použiť. V opačnom prípade je dovolené vybrať si z čokoľvek medzi 0100-0199.

    Všimnite si, že existuje niekoľko rôznych spôsobov, ako by tento blok mohol byť napísaný namiesto toho, ako je. Obidva príkazy prepínača mohli byť nahradené príkazmi if / else, pretože každý z nich má iba dve voľby. Tiež namiesto toho, aby sa ako prvá voľba pre prvý prepínač spustila voľba "4", mohlo by sa používať "predvolené", podobné tomu, ako to bolo v druhom kroku, pretože to bola jediná voľba. Výber medzi možnosťou if / else vs. switch, alebo kde sa má použiť predvolené kľúčové slovo namiesto konkrétnych hodnôt, často súvisí s osobnou preferenciou. Pokiaľ to funguje, používajte čo najviac.

    Teraz je čas na výstup.

        Výstup zápisu "$ FirstName $ Priezvisko $ Prefix- $ Suffix"

    To je skoro rovnako jednoduché, ako to dostane v skripte. Práve zobrazuje meno a priezvisko oddelené medzerami, potom iné miesto pred telefónnym číslom. Tu je miesto, kde sa pridáva štandardná pomlčka medzi Exchange Code a Subscriber ID.

    Uzavieracia konzola v spodnej časti je koniec slučky ForEach-Object z predchádzajúceho - vynechajte to, ak ste ju už získali.

    Časť 5: Vyčistenie a spustenie skriptu

    Po skončení práce je dobrý skript schopný sám vyčistiť. Opäť platí, že odstránenie premennej nižšie nie je v skutočnosti potrebné, ak idete len spustiť skript z konzoly, ale budete ju chcieť, ak ju niekedy plánujete spustiť v ISE.

    Odstrániť alias položky: \ g Remove-Variable ScriptFolder, RequiredFiles, Priezvisko, Muž, FirstName, NumberFormat, Prefix, Suffix, ValidInput, UserInput

    Po tom, čo to všetko urobíte, uložte skript s príponou ".ps1" do rovnakého priečinka ako vaše súbory s názvami. Uistite sa, že vaša ExecutionPolicy je nastavená tak, aby skript mohol bežať a dať jej vír.

    Tu je screenshot skriptu v akcii:

    Môžete tiež stiahnuť súbor ZIP obsahujúci tento skript PowerShell a textové súbory so zoznamami mien z nižšie uvedeného odkazu.

    Generátor náhodného mena a telefónneho čísla pre PowerShell