Pagina principala » HOWTO » Cum se genereaza nume aleatoare si numere de telefon cu PowerShell

    Cum se genereaza nume aleatoare si numere de telefon cu PowerShell

    Când aveți nevoie de un set de date pentru testare sau demonstrație și acest set trebuie să reprezinte Informații de identificare personală (PII), în general, nu doriți să utilizați date reale care reprezintă persoane reale. Aici, vă vom prezenta modul în care puteți utiliza PowerShell pentru a genera o listă de nume aleatoare și numere de telefon pentru o astfel de ocazie.

    De ce ai nevoie

    Înainte de a începe, există câteva instrumente și informații pe care ar trebui să le aveți:

    PowerShell

    Acest script a fost dezvoltat folosind PowerShell 4.0 și a fost testat și pentru compatibilitatea cu PowerShell 2.0. PowerShell 2.0 sau mai recent a fost încorporat în Windows de la Windows 7. Este, de asemenea, disponibil pentru Windows XP și Vista, ca parte a Windows Management Framework (WMF). Unele detalii suplimentare și link-uri pentru descărcări sunt de mai jos.

    • PowerShell 2.0 vine cu Windows 7. Utilizatorii Windows XP SP3 și Vista (SP1 sau mai târziu) pot descărca versiunea WMF corespunzătoare de la Microsoft în KB968929. Nu este acceptat pe XP SP2 sau mai jos, sau Vista fără SP1.
    • PowerShell 4.0 vine cu Windows 8.1. Utilizatorii Windows 7 SP1 pot face upgrade la acesta ca parte a unei actualizări WMF de la Centrul de descărcări Microsoft. Nu este disponibil pentru XP sau Vista.

    Nume

    Veți avea nevoie de anumite liste de nume pentru a fi folosite în generatorul aleatoriu. O sursă excelentă pentru o mult a numelor și a informațiilor privind popularitatea acestora (deși nu vor fi folosite pentru acest script), este Biroul de recensământ al Statelor Unite. Listele disponibile la linkurile de mai jos sunt foarte mari, deci este posibil să doriți să le tăiați puțin, dacă intenționați să generați o mulțime de nume și numere simultan. În sistemul nostru de testare, fiecare pereche de nume / număr a avut nevoie de aproximativ 1,5 secunde pentru a genera utilizarea listelor complete, dar kilometrajul va varia în funcție de specificațiile sistemului dvs..

    • Numele de familie
    • Primul nume al bărbatului
    • Primul nume feminin

    Indiferent de sursa pe care o folosiți, va trebui să generați trei fișiere text pe care scriptul le poate utiliza ca bazine pentru selectarea numelui. Fiecare fișier ar trebui să conțină numai nume și un singur nume pe fiecare rând. Acestea trebuie să fie stocate în același director ca și scriptul PowerShell.

    Surnames.txt trebuie să conțină numele de familie pe care doriți să le selectați. Exemplu:

    Smith Johnson Williams Jones Brown

    Males.txt ar trebui să conțină numele primelor de sex masculin pe care doriți să le selectați. Exemplu:

    James John Robert Mihai William

    Females.txt trebuie să conțină numele primelor de sex feminin pe care doriți să le selectați. Exemplu:

    Maria Patricia Linda Barbara Elizabeth

    Reguli pentru numere de telefon

    Dacă doriți să vă asigurați că numerele dvs. de telefon nu se potrivesc cu numărul real de telefon al unei persoane, cel mai simplu mod este să utilizați binecunoscutul Cod de schimb "555". Dar dacă doriți să afișați un set de date cu numere de telefon, 555 va începe să arate destul de monoton. Pentru a face lucrurile mai interesante, vom genera alte numere de telefon care încalcă regulile Planului de Numerotare din America de Nord (NANP). Mai jos sunt câteva exemple de numere nevalide de telefon, reprezentând fiecare clasă de număr care va fi generată de acest script:

    • (157) 836-8167
      Acest număr este nevalid, deoarece Codurile zonale nu pot începe cu 1 sau 0.
    • (298) 731-6185
      Acest număr este nevalid deoarece NANP nu atribuie codurile de zonă cu 9 ca a doua cifră.
    • (678) 035-7598
      Acest număr este nevalid, deoarece codurile de schimb nu pot începe cu 1 sau 0.
    • (752) 811-1375
      Acest număr este nevalid, deoarece codurile de schimb nu se pot termina cu două secunde.
    • (265) 555-0128
      Acest număr este nevalid, deoarece Codul de schimb este de 555, și ID-ul abonatului se încadrează în intervalul rezervat pentru numere fictive.
    • (800) 555-0199
      Acest număr este singurul număr de 800 cu un cod Exchange 555 care este rezervat pentru a fi utilizat ca număr fictiv.

    Rețineți că regulile de mai sus pot fi modificate și pot varia în funcție de jurisdicție. Ar trebui să faceți propriile dvs. cercetări pentru a verifica regulile actuale care se aplică localului pentru care veți genera numere de telefon.

    Comenzi curente

    Există câteva comenzi destul de obișnuite care vor fi folosite pe parcursul acestui scenariu, așa că ar trebui să obțineți o idee de bază despre ce înseamnă asta înainte de a ne scufunda în scris.

    • Foreach-obiect ia o matrice sau o listă de obiecte și efectuează operația specificată pe fiecare dintre ele. În cadrul unui bloc de script ForEach-Object, variabila $ _ este folosită pentru a se referi la elementul curent care este procesat.
    • dacă ... altfel declarațiile vă permit să efectuați o operațiune numai dacă sunt îndeplinite anumite condiții și (opțional) să specificați ce trebuie făcut atunci când această condiție nu este îndeplinită.
    • intrerupator declarațiile sunt ca și cum ar fi declarații cu mai multe alegeri. Comutatorul va verifica un obiect în mai multe condiții și va rula blocurile de script care sunt specificate pentru condițiile în care se potrivește obiectul. De asemenea, puteți specifica, opțional, un bloc implicit, care se va executa numai dacă nu sunt îndeplinite alte condiții. Comenzile de comutare utilizează, de asemenea, variabila $ _ pentru a se referi la elementul curent care este procesat.
    • in timp ce instrucțiunile vă permit să repetați continuu un bloc de script, atâta timp cât este îndeplinită o anumită condiție. Odată ce se întâmplă ceva care determină ca condiția să nu mai fie adevărată atunci când blocul de script-uri este terminat, bucla iese.
    • încearcă să prinzi declarațiile ajută la tratarea erorilor. Dacă ceva nu merge bine cu blocul de script specificat pentru încercare, blocul de captură va fi rulat.
    • Get-Content face ceea ce scrie pe tablă. Obține conținutul unui obiect specificat - de obicei un fișier. Acest lucru poate fi folosit pentru a afișa conținutul unui fișier text la consola sau, ca în acest script, să treacă conținutul de-a lungul conductei pentru a fi utilizat cu alte comenzi.
    • Scrie-gazdă pune lucruri în consola. Acesta este folosit pentru a prezenta mesaje către utilizator și nu este inclus în ieșirea scriptului dacă ieșirea devine redirecționată.
    • Scrie-ieșire generează efectiv ieșire. În mod normal, acesta este aruncat în consola, dar poate fi redirecționat și prin alte comenzi.

    Există și alte comenzi în scenariu, dar le vom explica în timp ce mergem.

    Construirea scriptului

    Acum e timpul să ne murdărim mâinile.

    Partea 1: Pregătirea pentru a merge

    Dacă vă place scriptul dvs. să înceapă să ruleze de la o consolă curată, iată prima linie pe care o doriți în el.

    Șterge-gazdă

    Acum, când avem un ecran curat, următorul lucru pe care vrem să-l facem este să verificăm scriptul pentru a ne asigura că tot ceea ce este necesar este în vigoare. Pentru a face acest lucru, trebuie să începem prin a spune unde să căutăm și ce să căutăm.

    $ ScriptFolder = Cale separată $ MyInvocation.MyCommand.Definition -Parent $ RequiredFiles = ('Males.txt', 'Females.txt', 'Surnames.txt')

    Prima linie este foarte utilă pentru orice scenariu. Definește o variabilă care indică dosarul care conține scriptul. Acest lucru este esențial dacă scriptul dvs. are nevoie de alte fișiere care se află în același director ca el însuși (sau o cale relativă cunoscută din acel director), deoarece în caz contrar veți întâlni erori dacă și când încercați să rulați scriptul în timp ce vă aflați într-un alt director de lucru.

    A doua linie creează o serie de nume de fișiere care sunt necesare pentru ca scriptul să funcționeze corect. Vom folosi acest lucru, împreună cu variabila $ ScriptFolder, în următoarea piesă în care verificăm dacă sunteți siguri că aceste fișiere sunt prezente.

    $ RequiredFiles ForEach-Object if (! (Test-Path "$ ScriptFolder \ $ _")) Scrie-gazdă "$ _ nu a fost găsit". -Despre culoareColor roșu $ MissingFiles ++

    Această bucată de script trimite matricea $ RequiredFiles într-un bloc ForEach-Obiect. În cadrul blocului de script, instrucțiunea if utilizează Căi de test pentru a vedea dacă fișierul pe care îl căutăm este locul în care acesta aparține. Calea de testare este o comandă simplă care, atunci când dă o cale de fișier, returnează un răspuns de bază adevărat sau fals pentru a ne spune dacă calea indică ceva ce există. Punctul de exclamare este acolo nu operator, care inversează răspunsul Test-Path înainte de a trece la instrucțiunea if. Deci, dacă Test-Path returnează false (adică fișierul pe care îl căutăm nu există), acesta va fi convertit la adevărat, astfel încât instrucțiunea if va executa blocul de script.

    Un alt lucru care trebuie notat aici, care va fi utilizat frecvent în acest script, este utilizarea de citate dublă în loc de citate unice. Când puneți ceva în ghilimele simple, PowerShell îl tratează ca un șir static. Orice s-ar afla în citatele singulare va fi trecut exact așa cum este. Citatele duble îi spune lui PowerShell să traducă variabilele și alte elemente speciale din șir înainte de a le transmite. Aici, dublu-citate înseamnă că în loc de a alerga Calea de test '$ ScriptFolder \ $ _'  de fapt, vom face ceva mai mult Calea de test "C: \ Scripts \ Surnames.txt" (presupunând că scriptul dvs. este în C: \ Scripts, iar ForEach-Object lucrează în momentul de față pe 'Surnames.txt').

    Pentru fiecare fișier care nu este găsit, Write-Host va afișa un mesaj de eroare în roșu pentru a vă spune care fișier lipsește. Apoi incrementează variabila $ MissingFiles, care va fi utilizată în următoarea piesă, pentru eroare și renunțare dacă lipsesc fișiere.

    dacă ($ MissingFiles) Write-Host "nu s-a găsit fișierul sursă $ MissingFiles. -Folos de fundal Culoare roșu Eliminați-ScriptFolder variabil, Fișiere necesare, Fișiere lipsăFilit

    Iată un alt șmecherie cu care poți să faci declarații. Majoritatea ghidurilor pe care le veți vedea dacă instrucțiunile vă vor spune să utilizați un operator pentru a verifica o condiție potrivită. De exemplu, aici am putea folosi dacă ($ MissingFiles -gt 0) pentru a vedea dacă $ MissingFiles este mai mare decât zero. Cu toate acestea, dacă utilizați deja comenzi care returnează o valoare booleană (ca în blocul anterior în cazul în care utilizam Calea de testare), acest lucru nu este necesar. Puteți, de asemenea, să faceți acest lucru fără acest lucru în astfel de cazuri, atunci când încercați doar să vedeți dacă un număr este diferit de zero. Orice număr non-zero (pozitiv sau negativ) este tratat ca fiind adevărat, în timp ce zero (sau, așa cum se poate întâmpla aici, o variabilă inexistentă) va fi tratată ca fiind falsă.

    Dacă există $ MissingFiles și este diferită de zero, Write-Host va posta un mesaj care vă spune câte fișiere lipsesc și că scriptul va fi anulat. Apoi, Remove-Variable va curata toate variabilele create si Exit va iesi din script. La consola PowerShell obișnuită, Remove-Variable nu este cu adevărat necesară pentru acest scop special, deoarece variabilele setate de scripturi sunt în mod normal aruncate atunci când scriptul iese. Cu toate acestea, PowerShell ISE se comportă un pic diferit, astfel încât poate doriți să păstrați acest lucru dacă intenționați să rulați scenariul de acolo.

    Dacă toate lucrurile sunt în ordine, scenariul va continua. Încă o pregătire pentru a face este un pseudonim pe care vom fi cu adevărat bucuroși să-l avem mai târziu.

    New-Alias ​​g Get-Random

    Aliasurile sunt folosite pentru a crea nume alternative pentru comenzi. Acestea pot fi utile pentru a ne ajuta să ne familiarizăm cu noua interfață (de exemplu: PowerShell are built-in aliasuri ca dir -> Get-ChildItem și cat -> Obțineți-conținut) sau pentru a face referințe scurte pentru comenzile utilizate în mod obișnuit. Iată, facem un lucru foarte referință pe termen scurt pentru Get-aleatoare care va fi folosită mult mai târziu.

    Get-Random face destul de mult ceea ce implică numele său. Având o matrice (ca o listă de nume) ca intrare, ea selectează un element aleator din matrice și o scutură. Poate fi folosit și pentru a genera numere aleatorii. Lucrul pe care trebuie să-l amintiți despre Get-Random și numerele deși este că, la fel ca multe alte operațiuni de calculator, începe să numere de la zero. Deci, în loc de Get-Random 10 adică mai naturală "dă-mi un număr de la 1 la 10" înseamnă cu adevărat "dă-mi un număr de la 0 la 9." Poți fi mai specific cu privire la selecția numărului, astfel încât Get-Random se comportă mai mult ca și cum ai fi natural așteaptă, dar nu vom avea nevoie de asta în acest scenariu.

    Partea 2: Obținerea unui utilizator și intrarea în muncă

    În timp ce un script care generează doar un nume aleatoriu și numărul de telefon este excelent, este mult mai bine dacă scriptul permite utilizatorului să precizeze câte nume și numere doresc să primească într-un lot. Din păcate, nu putem avea încredere că utilizatorii vor da întotdeauna o intrare validă. Deci, este puțin mai mult decât asta $ UserInput = Read-Host.

    în timp ce (! $ ValidInput) încercați [int] $ UserInput = Elemente de citire-gazdă "pentru generare '$ ValidInput = $ true Introduceți doar un număr. - Culoare roșie din față

    Instrucțiunea de mai sus verifică și anulează valoarea $ ValidInput. Atâta timp cât $ ValidInput este falsă sau nu există, va continua să circule prin blocul de script.

    Instrucțiunea try încearcă să introducă utilizator, prin Read-Host și încearcă să o convertească la o valoare întregă. (Asta este [Int] înainte de Read-Host.) Dacă reușește, va seta $ ValidInput la true astfel încât bucla while can exit. În cazul în care nu a reușit, blocul de captură înregistrează o eroare și, deoarece valoarea $ ValidInput nu a fost setată, bucla în timp ce se va întoarce și îi va solicita din nou utilizatorului.

    Odată ce utilizatorul a dat în mod corespunzător un număr ca intrare, vrem ca scriptul să anunțe că este pe cale să înceapă efectiv munca și apoi să o facă.

    Scrie-gazdă "'nGenerarea $ Nume de utilizator și numere de telefon.Vă rugăm să fiți pacient.'n" 1 ... $ UserInput | ForEach-Object 

    Nu vă faceți griji, nu vă vom lăsa pe cont propriu să vă dați seama de codul generatorului de numere aleatoare și ale numărului. Acesta este doar un comentariu de tip placeholder pentru a vă arăta unde se va potrivi următoarea secțiune (unde lucrarea reală se realizează).

    Linia Write-Host este destul de simplă. Pur și simplu spune câte nume și numere de telefon script-ul va genera și îi cere utilizatorului să rămână răbdător în timp ce scriptul își desfășoară activitatea.„n la începutul și la sfârșitul șirului este să inserați o linie goală înainte și după ieșire, doar pentru a da o anumită separare vizuală între linia de intrare și lista numelor și numerelor. Fiți conștienți de faptul că aceasta este o retro-tick (AKA "accent grave" - ​​de obicei, cheia de mai sus, la stânga de la 1) și nu un apostrof sau un singur citat în fața fiecărui n.

    Următoarea parte prezintă un mod diferit în care puteți utiliza o buclă ForEach-Object. În mod obișnuit, atunci când doriți ca un bloc de script să ruleze un anumit număr de ori, veți configura o buclă obișnuită pentru ($ x = 1; $ x -le $ UserInput; $ x ++) . ForEach-Object ne permite să simplificăm acest lucru alimentând-o cu o listă de numere întregi și, în loc să-i spunem să facă efectiv ceva cu acele numere întregi, îi dăm doar un bloc de script-uri statice pentru a rula până când se termină cu numere întregi pentru a face acest lucru pentru.

    Partea 3: Generarea unui nume aleatoriu

    Generarea numelui este cel mai simplu bit al restului acestui proces. Se compune doar din trei etape: alegerea unui nume, alegerea unui gen și alegerea unui nume. Ține minte acel alias pe care l-am făcut pentru a obține înapoi? Este timpul să începeți să folosiți acest lucru.

        $ Nume = Obțineți conținut "$ ScriptFolder \ Surnames.txt" | g $ Male = g 2 dacă ($ Bărbat) $ FirstName = Obțineți conținut "$ ScriptFolder \ Males.txt" | g altceva $ FirstName = Obțineți conținut "$ ScriptFolder \ Females.txt" | g

    Prima linie are lista noastră de nume de familie, o alimentează în selectorul aleator și atribuie numele ales lui $ Nume.

    Cea de-a doua linie ia în considerare sexul persoanei noastre. Adu-ti aminte cum incepe sa inceapa Get-Random de la zero si cum zero este fals si orice altceva este adevarat? Așa folosim Get-Random 2 (sau mult mai scurtă g 2 datorită aliasului nostru - ambele au ca rezultat o alegere între zero sau una) pentru a decide dacă persoana noastră este de sex masculin sau nu. Instrucțiunea if / else alege apoi aleatoriu un nume de sex masculin sau feminin în mod corespunzător.

    Partea 4: Generarea unui număr de telefon aleatoriu

    Iată o parte foarte distractivă. Mai devreme, v-am arătat cum există mai multe moduri în care puteți face un număr de telefon nevalid sau fictiv. Deoarece nu vrem ca toate numerele noastre să pară prea asemănătoare, vom alege de fiecare dată un format invalid. Formatele alese aleatoriu vor fi definite prin Codul Area și Codul Exchange, care vor fi stocate colectiv ca Prefix $.

        $ NumberFormat = g 5 comutator ($ 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)

    Prima linie este o generație directă de numere aleatorii pentru a alege formatul pe care urmează să-l urmăm pentru numărul de telefon. Apoi, instrucțiunea comutator are această alegere aleatorie și generează un prefix $ în mod corespunzător. Amintiți-vă că lista de tipuri invalide de numere de telefon? Valorile $ NumberFormat 0-3 corespund primelor patru din lista respectivă. Valoarea 4 poate genera una din ultimele două, deoarece ambele utilizează codul de schimb "555".

    Aici, puteți vedea, de asemenea, că folosim un alt truc cu ghilimele duble. Citatele duble nu vă permit doar să interpretați variabilele înainte de a obține o ieșire - acestea vă permit, de asemenea, să procesați blocuri de script. Pentru a face acest lucru, împachetați blocul de script astfel: „$ ()“. Deci, ceea ce aveți de mai sus este o mulțime de cifre individual randomizate, unele dintre ele fiind fie limitate în intervalul lor, fie stabilite în mod static, în conformitate cu regulile pe care trebuie să le urmăm. Fiecare șir are, de asemenea, paranteze și spații, așa cum ați aștepta în mod normal să vedeți într-o pereche de coduri de zonă și de cod de schimb.

    Ultimul lucru pe care trebuie să-l facem înainte de a fi pregătit să ne trimiteți numele și numărul de telefon este să generați un ID de abonat, care va fi stocat sub formă de sufix.

        comutare ($ NumberFormat) $ _ -lt 4 $ Suffix = "$ (g 10) $ (g 10) $ (g 10) 800) 555 '$ Suffix =' 0199 ' implicit $ Suffix = "01 $ (g 10) $ (g 10)"

    Din cauza regulilor speciale pentru numerele de 555, nu putem genera doar patru cifre aleatoare pentru sfârșitul fiecărui număr de telefon pe care script-ul nostru o va face. Deci, primul switch verifică dacă avem de-a face cu un număr de 555. Dacă nu, generează patru cifre aleatoare. Dacă este un număr de 555, al doilea comutator verifică codul de zonă 800. Dacă se potrivește, există doar un Suffix de $ valabil pe care îl putem folosi. În caz contrar, este permisă alegerea de la orice între 0100-0199.

    Rețineți că există câteva moduri diferite în care acest bloc ar fi putut fi scris, în loc de modul în care este. Ambele instrucțiuni de comutare ar fi putut fi înlocuite cu instrucțiuni if ​​/ else, deoarece fiecare manipulează numai două opțiuni. De asemenea, în loc de a apela în mod specific "4" ca o opțiune pentru prima declarație de comutare, "implicit" ar fi putut fi folosit similar cu modul în care a fost făcut în al doilea, deoarece a fost singura opțiune rămasă. Alegerea între opțiunea if / else vs. switch sau locul în care se utilizează cuvântul cheie prestabilit în loc de valorile specifice se întâmplă adesea la o preferință personală. Atâta timp cât funcționează, folosiți ceea ce vă simțiți cel mai bine.

    Acum, este timpul pentru ieșire.

        Scriere-ieșire "$ FirstName $ Prenume $ Prefix- $ Suffix"

    Acest lucru este la fel de simplu ca în scenariu. Emite doar numele și prenumele separate prin spații, apoi un alt spațiu înainte de numărul de telefon. Iată unde se adaugă linia standard dintre codul de schimb și ID-ul abonatului.

    Acea consola de închidere din partea de jos este sfârșitul bucla ForEach-obiect din mai devreme - omiteți acest lucru dacă l-ați primit deja.

    Partea 5: Curățirea și rularea scriptului

    După ce toate lucrările sunt terminate, un scenariu bun știe să curățească după sine. Din nou, eliminarea variabilelor de mai jos nu este cu adevărat necesară dacă doriți doar să rulați scriptul din consola, dar o veți dori dacă vreodată intenționați să o rulați în ISE.

    Ștergeți-aliasul elementului: \ g Ștergeți-Variable ScriptFolder, Fișierele necesare, Prenume, Masculin, FirstName, NumberFormat, Prefix, Suffix, ValidInput, UserInput

    După ce ați terminat totul, salvați scriptul cu o extensie ".ps1" în același director ca fișierele cu nume. Asigurați-vă că Politica de Execuție este setată astfel încât scriptul să poată fi rulat și să-i dați un vârtej.

    Iată o captură de ecran a scriptului în acțiune:

    De asemenea, puteți descărca un fișier ZIP care conține acest script PowerShell și fișiere text cu liste de nume de la linkul de mai jos.

    Numele de aleatoriu și generatorul de numere de telefon pentru PowerShell