If-Koubou

Cum se genereaza nume aleatoare si numere de telefon cu PowerShell

Cum se genereaza nume aleatoare si numere de telefon cu PowerShell (Cum să)

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). Mai multe detalii și linkuri pentru descărcări sunt 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 de nume și informații privind popularitatea lor (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 folosind listele 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 trebuie să conțină numele primelor de sex masculin pe care doriți să le selectați. Exemplu:

James John Robert Mihai William

Females.txt ar trebui să conțină numele primelor feminine 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ă localizării 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 script, așa că ar trebui să obțineți o idee de bază despre ce înseamnă asta înainte de a ne scufunda în scrierea ei.

  • 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 pentru ForEach-Object, variabila $ _ este utilizată pentru a se referi la elementul curent care este procesat.
  • dacă ... altfel instrucțiunile vă permit să efectuați o operațiune numai dacă sunt îndeplinite anumite condiții și (opțional) 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 împotriva mai multor 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 se potrivesc 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 script specificat pentru încercare, blocul de captură va rula.
  • 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 script-ului 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 este 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ă arătă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 aflate î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 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ă fișierele respective sunt prezente.

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

Această bucată de script trimite matricea $ RequiredFiles într-un bloc ForEach-Object. Î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 test 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 a nu operator, care inversează răspunsul Test-Path înainte de a trece pe 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 folosit frecvent în acest script, este utilizarea de citate dublu în loc de citate unice. Când puneți ceva în ghilimele simple, PowerShell îl tratează ca un șir static. Orice este î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 Test-Cale "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, se mărește variabila $ MissingFiles, care va fi folosită în următoarea piesă, pentru eroare și renunțare dacă lipsesc fișiere.

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

Iată un alt șmecherie cu care poți face 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ă o faceți 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 nu este zero, Write-Host va posta un mesaj care vă spune câte fișiere lipseau și că scriptul va renunța. 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 eliminate după terminarea scriptului. 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 de făcut 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. Aici, facem a 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 scutește. Poate fi folosit și pentru a genera numere aleatorii.Lucrul pe care trebuie să-l amintiți despre Get-Random și cifrele 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 un număr de telefon este mare, este mult mai bine dacă scriptul permite utilizatorului să precizeze câte nume și numere doresc să obțină într-un lot. Din păcate, nu putem avea încredere că utilizatorii vor da întotdeauna o intrare validă. Deci, există un pic mai mult pentru asta decât pentru asta $ UserInput = Read-Host.

în timp ce (! $ ValidInput) încercați [int] $ UserInput = Elementele de citire-gazdă "care vor fi generate" $ ValidInput = $ true Introduceți doar un număr. -Blocul roșuColor roșu

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

Instrucțiunea try generează intrarea utilizatorului, 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. Dacă nu a reușit, blocul de captură înregistrează o eroare și, deoarece valoarea $ ValidInput nu a fost setată, bucla în timp se va întoarce și va cere 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ă-și înceapă efectiv activitatea și apoi să o facă.

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

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

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ă fie răbdător în timp ce scriptul își desfășoară activitatea.„nla începutul și sfârșitul șirului este să inserați o linie necompletată înainte și după ieșire, doar pentru a da o separare vizuală între linia de intrare și lista numelor și numerelor. Fiți conștienți de faptul că acesta este un bifați (AKA "accent grave" - ​​de obicei, cheia de deasupra tab-ului, la stânga lui 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 folosi 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.

Partea 3: Generarea unui nume aleatoriu

Generarea numelui este cel mai simplu bit al restului acestui proces. Se compune numai din trei etape: alegerea unui nume de familie, alegerea unui gen și alegerea unui nume. Ține minte acel alias pe care l-am făcut înapoi în timp pentru Get-Random? 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 numele $.

A doua linie tratează genul persoanei noastre. Adu-ti aminte cum incepe sa inregistreze 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 de sex 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 invalid sau fictiv. Deoarece nu vrem ca toate numerele noastre să pară prea asemănătoare, vom alege de fiecare dată un format nevalid. 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 10)) $ (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 ia această alegere aleatorie și generează un prefix $ în consecință. Amintiți-vă că lista de tipuri nevalabile de numere de telefon? Valorile $ NumberFormat 0-3 corespund primelor patru din lista respectivă. Valoarea 4 poate genera unul 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 fie limitate în intervalul lor, fie fixate în mod static, în conformitate cu regulile pe care trebuie să le urmăm. Fiecare șir are, de asemenea, paranteză și spațiere, 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 gata să ieșim din numele și numărul de telefon este să generăm un ID de abonat, care va fi stocat ca Suffix.

  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 555 de numere, nu putem genera doar patru cifre aleatoare pentru sfârșitul fiecărui număr de telefon pe care scenariul 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, i se permite să aleagă din 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 comutator, "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 dintre opțiunea if / else vs. switch sau locul în care se utilizează cuvântul cheie prestabilit în loc de valorile specifice duce 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 de la mai devreme - omiteți acest lucru dacă ați primit-o 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ă veți rula doar scriptul din consola, dar o veți dori dacă vreți să o rulați în ISE.

Eliminați-aliasul elementului: \ g Ștergeți-variabilă ScriptFolder, fișiere obligatorii, 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 și 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 scenariului î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