10Sep

Ako generovať náhodné mená &Telefónne čísla s PowerShellom

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 vedieť, ako môžete použiť PowerShell na generovanie zoznamu náhodných mien a telefónnych čísel pre takúto príležitosť.

Čo potrebujete

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

PowerShell

Tento skript bol vyvinutý s použitím 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 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. Názvy

Budete potrebovať nejaké zoznamy názvov, ktoré sa majú pridať do náhodného generátora. Skvelý zdroj pre veľa názvov a informácie 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 systéme testovania si každý pár / pár trval približne 1,5 sekundy na vytvorenie úplných zoznamov, ale počet kilometrov sa bude líšiť v závislosti od vlastných systémových špecifikácií.

  • Priezviská
  • Mužské prvé mená
  • Prvé mená

Nezávisle od zdroja, ktorý použijete, budete musieť generovať tri textové súbory, ktoré môže skript použiť ako skupiny na výber mena. 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 mal obsahovať priezviská, od ktorých chcete skript vyberať.Príklad:

Smith Johnson Williams Jones Brown

Males.txt by mal obsahovať menné mená, od ktorých chcete skript vybrať.Príklad:

James John Robert Michael

Females.txt by mal obsahovať mená, z ktorých chcete skript vybrať.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 údajov s množstvom telefónnych čísel, 555 začne 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 kódy oblastí nemôžu začínať číslom 1 alebo 0.
  • ( 298) 731-6185
    Toto číslo je neplatné, pretože NANP nepripisuje kódy oblasti s číslom 9 ako druhú číslicu.
  • ( 678) 035-7598
    Toto číslo je neplatné, pretože kódy Exchange nemôžu začínať s 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 800 číslom s 555 Exchange Code, ktoré je vyhradené pre fiktívne číslo.

Všimnite si, ž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 znamená predtým, než sa ponoríme do skutočného písania.

  • ForEach-Object zaberá pole alebo zoznam objektov a vykoná danú operáciu na každom z nich. V bloku skriptov ForEach-Object sa premenná $ _ používa na označenie aktuálnej položky, ktorá sa spracováva.
  • ak. .. inak príkazy umožňujú vykonať operáciu iba vtedy, ak sú splnené určité podmienky a( voliteľne) špecifikujte, čo treba robiť, keď táto podmienka nie je splnená.Spínače
  • prepínače sú ako príkazy 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 určiť predvolený blok, ktorý sa bude spúšťať iba vtedy, ak sa nezodpovedajú žiadne ďalšie podmienky. Spínacie príkazy tiež používajú premennú $ _, aby sa odvolávali na aktuálnu spracovávanú položku.
  • , zatiaľ čo príkazy umožňujú priebežne opakovať blok skriptu, pokiaľ je splnená určitá podmienka. Keď sa stane niečo, čo spôsobí, že podmienka prestane byť pravdivá po ukončení bloku skriptu, ukončí sa slučka.
  • skúste. .. chytiť vyhlásenia pomôcť 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 cín. Získate 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.
  • Správa hostiteľa dáva veci do konzoly. Používa sa na zobrazovanie správ používateľovi a nie je zahrnutý do výstupu skriptu, ak sa výstup presmeruje.
  • Zápisový výstup skutočne generuje výstup. Za normálnych okolností sa toto dá do konzoly, ale môže byť tiež presmerované inými príkazmi.

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

Vytváranie skriptu

Teraz je čas, aby sme si našli ruky špinavé.

Časť 1: Pripravte sa na cestu

Ak sa vám páči, aby váš skript začal bežať z čistej konzoly, tu je prvý riadok, ktorý chcete v ňom.

Clear-Host

Teraz, keď máme čistú obrazovku, ďalšia vec, ktorú chceme urobiť, je skontrolovať skript, aby sa uistil, ž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-Path $ 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 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é.

Požadované súboryForEach-Object{ if( !( Test-Cesta "$ ScriptFolder \ $ _")){ Správa-Host "$ _ nenašiel."-ForegroundColor Červená $ MissingFiles ++}}

Tento kus skriptu pošle pole $ RequiredFiles do bloku ForEach-Object. V rámci tohto bloku skriptu príkaz if používa Test-Path na zistenie, či hľadaný súbor 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 operátor , nie , ktorý zvráti odpoveď testovacej cesty predtým, než ju odovzdá príkaz if. 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 všimnite tu, ktorá sa bude často používať v tomto skripte, je použitie dvojitých úvodzoviek namiesto jednočinný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 testovacej cesty '$ ScriptFolder \ $ _' budeme robiť niečo viac ako Test-Path 'C: \ Scripts \ Surnames.txt' ( za predpokladu,skript je v C: \ Scripts a ForEach-Object práve pracuje na 'Surnames.txt').

Pre každý súbor, ktorý nenájdený, bude Write-Host uverejnený chybové hlásenie v červenej farbe, aby vám oznámil, 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 "Nenašli sa zdrojové súbory $ MissingFiles.-ForegroundColor Červená Odstrániť-Variabilný ScriptFolder, RequiredFiles, MissingFiles Exit}

Tu je ďalší úhľadný trik, ktorý môžete urobiť s vyhláseniami. Väčšina sprievodcov vám uvidí, či vyhlásenia vám oznámia, že používate operátor, aby ste skontrolovali zodpovedajúce podmienky. Napríklad tu by sme mohli použiť , ak( $ ​​MissingFiles -gt 0) zistí, č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 tu môže stať, neexistujúca premenná) bude považovaná za falošnú.

Ak existuje $ MissingFiles a nie je nula, Write-Host uverejní správu o tom, koľko súborov chýbalo a ktoré 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. PowerShell ISE sa však správa trochu inak, takže by ste si to mohli nechať, ak máte v pláne spustiť skript.

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

Nové aliasy g Prijaté náhodné

Aliasy sa používajú na vytváranie alternatívnych názvov príkazov. Tieto informácie vám môžu pomôcť oboznámiť sa s novým rozhraním( napríklad: PowerShell má zabudované aliasy ako dir - & gt; Get-ChildItem a cat - & gt; Get-Content ) alebo urobiť krátke referenciepre bežne používané príkazy. Tu robíme veľmi krátku referenciu pre príkaz Get-Random , ktorý sa bude oveľa neskôr používať.

Get-Random veľa robí to, čo naznačuje jeho názov. Vzhľadom na pole( ako zoznam názvov) ako vstup si vyberie náhodnú položku z poľa a vypliesie ju. 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 Get-Random 10 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 by ste prirodzene očakávali, 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 &telefónne číslo je skvelé, je oveľa lepšie, ak skript umožňuje používateľovi určiť, koľko mien &čísla, ktoré chcú získať v jednej dávke. Bohužiaľ nemôžeme skutočne dôverovať používateľom, aby vždy dali platný vstup. Takže existuje 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 'Neplatný vstup. Zadajte iba číslo. "-ForegroundColor Red}}

Vyhlásenie while vyššie kontroluje a neguje hodnotu $ ValidInput. Pokiaľ $ ValidInput je falošný, alebo neexistuje, bude pokračovať vo svojej skripte blokom skriptu.

Príkaz try vstupuje užívateľom cez Read-Host a pokúša sa premeniť 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 nie je úspešný, blok chyby uverejní chybu a pretože hodnota $ ValidInput sa nestala nastavená, cyklus while sa vráti späť a zobrazí výzvu používateľovi znova.

Akonáhle používateľ správne zadal číslo ako vstup, chceme skript oznámiť, že práve začne pracovať a potom sa o tom podarí.

Write-Host "` n Generovanie $ UserInput mená a telefónne čísla. Prosím, buďte trpezlivý.`n "1. . $ UserInput |ForEach-Object{ & lt; # INSERT RANDOM NAME &GENERÁTOR NUMBER HERE # & gt;}

Nebojte sa, nechceme vás opustiť sami, aby ste zistili náhodný názov &kód generátora čísel. To je len poznámka typu placeholder, ktorá vám ukáže, kde ďalšia časť( kde sa skutočná práca robí) sa hodí.

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ý, kým skript nevykoná svoju prácu. `n na začiatku a na konci reťazca má vložiť prázdny riadok pred a po tomto výstupe, len aby mu dal nejaké vizuálne oddelenie medzi vstupným riadkom a zoznamom mien a &Čísla. Uvedomte si, že to je spätný tick( AKA "hlboký prízvuk" - zvyčajne kľúč nad tabuľkou, naľ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 pre bežnú cyklu ako ( $ x = 1; $ x -le $ UserInput; $ x ++){ & lt; # INSERT SCRIPTZDE # & gt;}. ForEach-Object nám umožňuje zjednodušiť to tak, že ho pridáme do zoznamu celých čísel a namiesto toho, aby sme mu povedali, že skutočne urobí čokoľvek s týmito celistvami, stačí mu dať statický skriptový blok, ktorý bude fungovať, 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 = Získajte obsah "$ ScriptFolder \ Females.txt" |g}

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

Druhý riadok vyberá pohlavie našej osoby. Pamätajte, ako začne Get-Random počítať od nuly a ako je nula falošná a všetko ostatné je pravdivé?Takto 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 jedným), 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.

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

Tu je naozaj zábavná súč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 vyberať neplatný formát čísel zakaždým. Náhodne vybrané formáty budú definované pomocou ich 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 $ 2 $ $ Prefix =$( g 10) $( g 10)) $( g 2) $( g 10) $( g 10) "} 3{ $ Prefix =) $( g 10) 11 "} 4{ $ Prefix ="( $( g 10) $( g 10) $( g 10) 555 "}

Prvý riadok je jednoduché generovanie náhodných čísiel,budeme nasledovať telefónne číslo. Následne príkaz switch prevezme túto náhodnú voľbu a zodpovedajúcim spôsobom generuje prefix $.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é úvodzovky vám neumožňujú iba interpretovať premenné predtým, ako sa výstup stane reťazcom - tiež vám umožnia spracovať bloky skriptov. Ak to chcete urobiť, zabalíte blok skriptu takto: "$( & lt; # SCRIPT HERE # & gt;)" .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ú nastavené staticky podľa pravidiel, ktoré musíme dodržiavať.Každý reťazec má tiež zátvorky a medzery, ako by ste normálne očakávali v párovom kóde a kóde Exchange Code.

Posledná vec, ktorú musíme urobiť predtým, než budeme pripravení vydať náš názov &telefónne číslo generuje identifikátor úč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 čísla 555generovať štyri náhodné číslice na konci každého telefónneho čísla, ktoré náš skript urobí.Takže prvý prepínač skontroluje, či máme číslo 555.Ak nie, generuje štyri náhodné číslice. Ak ide o čí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 mohol byť tento blok napísaný namiesto toho, ako je. Obidve vý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ý volal prvý prepínač "4", namiesto špecifického volania "4", mohlo byť použité "predvolené" podobné tomu, ako to bolo vykonané v druhej, pretože to bola len jedna z možností.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, sa často blíži k otázke osobných preferencií.Pokiaľ to funguje, používajte čo najviac.

Teraz je čas na výstup.

Write-Out "$ FirstName $ Priezvisko $ Prefix- $ Suffix"}

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

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

Časť 5: Vyčistenie a spustenie skriptu

Po vykonaní všetkej práce, dobrý skript vie, ako sa vyčistiť po sebe. Opäť platí, že odstránenie premennej nižšie nie je v skutočnosti potrebné, ak chcete spustiť skript z konzoly, ale budete ju chcieť, ak ju niekedy plánujete spustiť v ISE.

Odstrániť alias položky: \ g Odstrániť-variabilný súbor skriptu, RequiredFiles, Priezvisko, Muž, FirstName, NumberFormat, Prefix, Suffix, ValidInput, UserInput

Po dokončení uložte skript s príponou. ps1v rovnakom priečinku 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 si tiež stiahnuť súbor ZIP obsahujúci tento skript PowerShell a textové súbory so zoznamom mien z nižšie uvedeného odkazu.

Náhodné meno &Generátor telefónneho čísla pre PowerShell