10Sep

Cum se generează nume aleatorii &Numere de telefon cu PowerShell

click fraud protection

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 arăta cum puteți utiliza PowerShell pentru a genera o listă de nume aleatoare și numere de telefon pentru o astfel de ocazie.

Ce aveți 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.
  • instagram viewer
  • 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 alimentate în generatorul aleatoriu. O sursă excelentă pentru un lot de nume și informații privind popularitatea acestora( deși nu vor fi folosite pentru acest script), este Biroul de recensământ al Statelor Unite. Listele disponibile la link-urile 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.

  • Nume de familie
  • Primul nume de sex masculin
  • Primul nume de familie

Indiferent de sursa pe care o folosiți, va trebui să generați trei fișiere text pe care scriptul le poate utiliza ca grupuri 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 ar trebui 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 ar trebui să conțină numele primelor de sex feminin pe care doriți să le selectați. Exemplu:

Mary 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 zonelor cu 9 ca a doua cifră.
  • ( 678) 035-7598
    Acest număr nu este valid, 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 555, și ID-ul abonatului este î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 comune

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 ceea ce înseamnă aceasta înainte de a ne scufunda în scrierea ei.

  • ForEach-Object 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ție 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ă.Comutatorul
  • comutatoarele sunt ca în cazul în care declarațiile cu mai multe opțiuni. 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 sunt îndeplinite alte condiții. Comenzile de comutare utilizează, de asemenea, variabila $ _ pentru a se referi la elementul curent care este procesat.
  • în 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.
  • încercați. .. capturați instrucțiunile ajutați în tratarea erorilor. Dacă ceva nu merge bine cu blocul script specificat pentru încercare, blocul de captură va rula.
  • Obțineți-Conținut face ceea ce se spune pe staniu. Obține conținutul unui obiect specificat - de obicei un fișier. Aceasta poate fi utilizată 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-Host pune lucruri în consolă.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ă.
  • Write-Output generează de fapt 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 porni

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

Clear-Host

Acum că 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 are nevoie 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 = Split-Path $ 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ă executați scriptul în timp ce vă aflați într-un altdirector de lucru.

Cea de-a doua linie creează o serie de nume de fișiere care sunt necesare pentru funcționarea corectă a scriptului. 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.

$ RequiredFilesForEach-Object{ if( !( Test-Path "$ ScriptFolder \ $ _")){ Scrieți-gazdă "$ _ nu a fost găsit".-FiregroundColor Red $ 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 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 un operator care nu este , 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 de observat aici, care va fi utilizat 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 să rulați Test-Path '$ ScriptFolder \ $ _' vom face de fapt ceva mai mult ca Test-Path 'C: \ Scripts \ Surnames.txt' script-ul 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 se va renunța dacă lipsesc fișiere.

dacă( $ MissingFiles){ Write-Host "Nu s-a găsit fișierul( sursele) sursă de $ MissingFiles.-Despre culoareColor roșu Eliminați-ScriptFolder variabil, Fisiere necesare, Exit MissingFiles}

Iată un alt truc cu care puteți face cu declarațiile. 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ă $ MissingFiles există și nu este zero, Write-Host va posta un mesaj care vă spune câte fișiere lipseau ș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 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 Obțineți-Random

Aliasurile sunt folosite pentru a crea nume alternative pentru comenzi. Acestea pot fi utile pentru a ne ajuta să facem cunoștință cu noua interfață( de exemplu: PowerShell are alias-uri cum ar fi dir -> Get-ChildItem și cat - & gt; Get-Content ) sau pentru a face referințe scurtepentru comenzile utilizate în mod obișnuit. Aici, facem o referință foarte scurtă pentru comanda Get-Random 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 însemnând mai natural "da-mi un număr de la 1 la 10" înseamnă într-adevăr "dă-mi un număr de la 0 la 9." Poți fi mai specific cu privire la selecția numărului,-Randomul se comportă mai mult ca și cum v-ați fi așteptat în mod firesc, dar nu vom avea nevoie de asta în acest scenariu.

Partea 2: Obținerea intrării de utilizator și a porni la lucru

În timp ce un script care generează doar un singur nume aleatoriu &numărul de telefon este mare, este mult mai bine dacă scriptul permite utilizatorului să precizeze câte nume și &numere pe care doresc să le primească î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 doar $ UserInput = Read-Host .

în timp ce( ! $ ValidInput){ încercați{ [int] $ UserInput = Articolele "Read-Host -Prompt" care urmează să fie generate '$ ValidInput = $ true}Introduceți doar un număr.-ForwardColor Red}}

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

Instrucțiunea try încearcă să introducă utilizator, prin Read-Host și încearcă să o convertească la o valoare întregă.(Aceasta 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 scenariul să anunțe că este pe cale să înceapă de fapt să lucreze ș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{ & lt; # INSERT RANDOM NAME &NUMBER GENERATOR AICI # & gt;}

Nu vă faceți griji, nu vă vom lăsa pe cont propriu pentru a afla numele aleatoriu &codul generatorului de coduri. 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 face munca. `n la începutul și la sfârșitul șirului este de a introduce o linie necompletată înainte și după ieșirea, doar pentru a da o anumită separare vizuală între linia de intrare și lista de nume &numere. Fiți conștienți de faptul că acest lucru este un back-tick( AKA "accent grave" - ​​de obicei, cheia de deasupra tab-ului, la stânga 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 script să ruleze un anumit număr de ori, veți configura o buclă obișnuită ca pentru( $ x = 1; $ x -le $ UserInput; $ x ++){ & lt; # INSERT SCRIPTAICI # & gt;}. 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 doar 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.

$ Surname = 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? Acesta este modul în care 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 bărbat 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. Din moment ce 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 $.($ 10) $( g 10) $( g 10) $( g 10) $( g 10)"}{ $ Prefix ="( $( g 10) 9 $( g 10)) $( g 10) $( g 10)$( g 10) $( g 2) $( g 10) $( g 10) $( g 10)) $( g 10) 11 "} 4{ $ Prefix ="( $( g 10) $( g 10) $( g 10)) 555 "

Prima linie este o generatie de numere aleatoareo să 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, înfășurați blocul de script astfel: "$( & lt; # SCRIPT HERE # & gt;)" .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ă scoatem numele și &numărul de telefon este pentru a genera un ID de abonat, care va fi stocat ca Suffix $.Comutator

( $ 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 numere,generați patru cifre aleatoare pentru sfârșitul fiecărui număr de telefon pe care scriptul nostru îl 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 $ Surname $ Prefix- $ Suffix"}

Acest lucru este cam 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ă și 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ățarea ș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.

Ștergeți-alias articol: \ g Ștergeți-Variable ScriptFolder, RequiredFiles, Prenume, Masculin, FirstName, NumberFormat, Prefix, Suffix, ValidInput, UserInput

După ce ați terminat, salvați scriptul cu o extensie ".ps1"în același folder 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 scriptului în acțiune:

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

Nume aleatoriu &Generator de numere de telefon pentru PowerShell