10Sep

Kako generirati slučajna imena &Brojevi telefona s PowerShellom

Kad trebate skup podataka za testiranje ili demonstraciju, a taj skup mora predstavljati osobne podatke( PII), obično ne želite koristiti stvarne podatke koji predstavljaju stvarne ljude. Ovdje ćemo proučiti kako možete koristiti PowerShell kako biste generirali popis slučajnih imena i brojeva telefona za takvu priliku.

Što trebate

Prije nego započnete, trebali biste pronaći neke alate i informacije:

PowerShell

Ova je skripta razvijena korištenjem PowerShell 4.0 i testirana je za kompatibilnost s PowerShell 2.0.PowerShell 2.0 ili noviji ugrađen je u sustav Windows od sustava Windows 7. Također je dostupan za Windows XP i Vista kao dio Windows Management Framework( WMF).Neke daljnje pojedinosti i veze za preuzimanja nalaze se u nastavku.

  • PowerShell 2.0 dolazi s Windows 7. Windows XP SP3 i Vista( SP1 ili noviji) korisnici mogu preuzeti odgovarajuću verziju WMF-a iz tvrtke Microsoft u KB968929.Nije podržan na XP SP2 ili niže, ili Vista bez SP1.
  • PowerShell 4.0 dolazi s programom Windows 8.1.Korisnici sustava Windows 7 SP1 mogu nadograditi na njega kao dio ažuriranja WMF-a iz Microsoftovog centra za preuzimanje. Nije dostupno za XP ili Vista.

Imena

Trebat će vam neke popise imena za unos u slučajni generator. Odličan izvor za puno imena, te informacije o njihovoj popularnosti( iako se to neće koristiti za ovu skriptu), je Ured za popis stanovništva Sjedinjenih Američkih Država. Popisi dostupni na niže navedenim vezama vrlo su velik, pa biste ih mogli skratiti ako planirate generirati mnogo imena i brojeva odjednom. Na našem testnom sustavu svaki naziv / broj parova trajao je oko 1,5 sekunde da bi se generirali pomoću punih popisa, ali kilometraža će se razlikovati ovisno o vlastitim specifikacijama sustava.

  • Prezime
  • Muška imena
  • Ženska imena

Bez obzira na izvor koji koristite, morat ćete generirati tri tekstualne datoteke koje skripta može koristiti kao baze za odabir naziva. Svaka datoteka mora sadržavati samo imena i samo jedan naziv po retku. Ti se podaci moraju pohraniti u istoj mapi kao i PowerShell skripta.

Surnames.txt bi trebao sadržavati prezimena kojima želite odabrati skriptu. Primjer:

Smith Johnson Williams Jones Brown

Males.txt bi trebao sadržavati muška imena koja želite odabrati iz skripte. Primjer:

James John Robert Michael William

Females.txt bi trebao sadržavati ženska imena koja želite odabrati iz skripte. Primjer:

Mary Patricia Linda Barbara Elizabeth

Pravila za telefonske brojeve

Ako želite biti sigurni da se vaši telefonski brojevi ne podudaraju s bilo kim pravim brojem telefona, najlakši je način koristiti poznati "Exchange" 555 kod. Ali ako ćete prikazivati ​​skup podataka s puno telefonskih brojeva, 555 će početi izgledati prilično monoton stvarno brzo. Da bi stvari bile zanimljivije, generirat ćemo i druge telefonske brojeve koji krše pravila Sjevernoameričkog plana numeriranja( NANP).U nastavku su prikazani neki uzorci nevažećih telefonskih brojeva, koji predstavljaju svaku klasu broja koji će biti generirana ovom skriptom:

  • ( 157) 836-8167
    Ovaj broj je nevažeći jer Prekršajni kodovi ne mogu započeti sa 1 ili 0.
  • ( 298) 731-6185
    Ovaj broj je nevažeći jer NANP ne dodjeljuje prečice s 9 kao drugu znamenku.
    ( 678) 035-7598
    Ovaj broj nije valjan jer Exchange Codes ne mogu započeti s 1 ili 0.
  • ( 752) 811-1375
    Ovaj broj nije valjan jer Exchange Codes ne mogu završiti s dva 1s.
  • ( 265) 555-0128
    Ovaj broj nije valjan jer je Exchange kod 555, i ID pretplatnika unutar raspona rezerviranog za fiktivne brojeve.
  • ( 800) 555-0199
    Ovaj broj je jedini 800 broj sa 555 Exchange Code koji je rezerviran za uporabu kao fiktivni broj.

Imajte na umu da su gore navedena pravila podložna promjenama i mogu se razlikovati po nadležnosti. Trebali biste izvršiti vlastita istraživanja kako biste provjerili postojeća pravila koja se primjenjuju na prostor za koji ćete generirati telefonske brojeve.

Uobičajene naredbe

Postoje neke prilično uobičajene naredbe koje će se koristiti tijekom ove skripte, tako da bi trebali dobiti osnovnu ideju o tome što to znači prije nego što zaronimo u stvarni pisanja.

  • ForEach-Object uzima niz, ili popis objekata i obavlja navedenu operaciju na svakoj od njih. Unutar bloka skripte ForEach-Object, varijabla $ _ se koristi za označavanje trenutačne stavke koja se obrađuje.
  • ako. .. drugo izjave omogućuju izvršavanje operacije samo ako su zadovoljeni određeni uvjeti i( opcionalno) odredite što treba učiniti kada taj uvjet nije zadovoljen.
  • prekidač izjave su kao ako su izjave s više izbora. Prekidač će provjeriti objekt protiv nekoliko uvjeta i pokrenuti sve blokove skripte koji su navedeni za uvjete koji odgovaraju objektu. Također možete, po želji, odrediti zadani blok koji će se pokrenuti samo ako se ne podudaraju drugi uvjeti. Izmjene sklopke također koriste varijablu $ _ kako bi se odnosile na trenutnu stavku koja se obrađuje.
  • , a izjave iz omogućuju neprekidno ponavljanje skripte blok dok god je zadovoljen određeni uvjet. Nakon što se dogodi nešto što uzrokuje da više ne bude istina kada blok skripta završi, petlja izlazi.
  • pokušaj. .. uhvatiti izjave pomoći u rješavanju pogrešaka. Ako nešto krene u krivu s blokom skripte navedenoj za pokušaj, blok ulova će se pokrenuti.
  • Get-Content čini ono što kaže na limenci. Dobiva sadržaj određenog objekta - obično datoteku. To se može upotrijebiti za prikaz sadržaja tekstualne datoteke na konzoli ili, kao u ovoj skripti, prolazak sadržaja na cjevovodu za upotrebu s drugim naredbama.
  • Write-Host stavlja stvari u konzolu. Ovo se koristi za prikazivanje poruka korisniku i nije uključeno u izlaz skripte ako se izlaz preusmjerava.
  • Write-Output zapravo stvara izlaz. Normalno, to se baca na konzolu, ali može biti preusmjereno i drugim naredbama.

Postoje druge naredbe u skripti, ali ćemo ih objasniti dok idemo.

Izrada skripte

Sada je vrijeme da se ruke prljave.

Dio 1: Priprema za početak

Ako vam se svidjela skripta da počnete prikazivati ​​s čiste konzole, ovdje je prva linija koju želite u njemu.

Clear-Host

Sada kada imamo čistu ekranu, sljedeća stvar koju želimo učiniti jest da provjerite skriptu kako bismo bili sigurni da je sve potrebno. Da bismo to postigli, moramo početi govoriti gdje trebamo potražiti i što tražiti.

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

Prva crta postoji vrlo korisna za bilo koju skriptu. Određuje varijablu koja ukazuje na mapu koja sadrži skriptu. To je bitno ako vaša skripta treba druge datoteke koje se nalaze u istom direktoriju kao i sami( ili poznati relativni put iz tog direktorija), jer ćete inače naići na pogreške ako i kada pokušate pokrenuti skriptu dok ste u drugomradni imenik.

Druga linija stvara niz naziva datoteka koji su potrebni za pravilno funkcioniranje skripte. Koristit ćemo to zajedno s varijablom $ ScriptFolder u sljedećem dijelu gdje provjeravamo da su te datoteke prisutne.

$ RequiredFiles |Za svaki objekt{ if( !( Test-Path "$ ScriptFolder \ $ _")){ Write-Host "$ _ nije pronađen."-ForegroundColor Red $ MissingFiles ++}}

Ovaj komad skripte šalje polje $ RequiredFiles u blok ForEach-Object. Unutar tog skripta blok, if izjava koristi Test-Path da vidi je li datoteka koju tražimo gdje pripada. Test-Path jednostavna je naredba koja, kada se daje putanju datoteke, vraća osnovni istiniti ili lažni odgovor da bi nam ukazao ako put ukazuje na nešto što postoji. Usklednička točka nalazi se operator , a ne , koji poništava odgovor Test-Path prije nego što ga proslijedi na if izjavu. Dakle, ako se Test-Path vraća neispravno( to jest, datoteka koju tražimo ne postoji), ona će se pretvoriti u istinito, tako da if statement izvodi skriptni blok.

Još jedna stvar koju treba spomenuti ovdje, koja će se često koristiti u ovoj skripti, jest uporaba dvostrukih citata umjesto pojedinačnih citata. Kada stavite nešto u pojedinačne citate, PowerShell ga tretira kao statički niz.Što god je u pojedinačnim citatima, proći će točno onako kako jest. Dvostruki navodi kažu da PowerShell prevodi varijable i neke druge posebne stavke unutar niza prije nego što je prođe. Ovdje dvostruki navodi znače da umjesto da pokrenemo Test-Path '$ ScriptFolder \ $ _' mi zapravo radimo nešto slično Test-Path 'C: \ Scripts \ Surnames.txt' ( uz pretpostavkuskripta je u C: \ Scripts, a ForEach-Object trenutno radi na 'Surnames.txt').

Za svaku datoteku koja nije pronađena, Write-Host će postaviti poruku o pogrešci crvenom bojom da vam kažete koja datoteka nedostaje. Zatim povećava varijablu $ MissingFiles koja će se upotrebljavati u sljedećem komadu, pogreške i prekidanje ako je nedostajala datoteka.

ako( $ MissingFiles){ Write-Host "Nije uspjelo pronaći izvorne datoteke datoteka MissingFiles. Prekidanje skripte."-ForegroundColor Red Remove-Variable ScriptFolder, RequiredFiles, MissingFiles Izlaz}

Evo još jedan zgodan trik možete učiniti ako izjave. Većina vodiča ćete vidjeti ako vam izjave govore da koristite operatera da biste provjerili podudaranje. Na primjer, ovdje možemo koristiti ako( $ MissingFiles -gt 0) da vidimo je li $ MissingFiles veći od nule. Međutim, ako već upotrebljavate naredbe koje vraćaju Booleovu vrijednost( kao u prethodnom bloku u kojoj smo koristili Test-Path) koji nisu potrebni. Također možete to učiniti bez nje u takvim slučajevima, kada samo provjeravate je li broj ne nula. Bilo koji broj koji nije nula( pozitivan ili negativan) smatra se pravim, a nula( ili, kao što se ovdje može dogoditi, nepostojeća varijabla) tretira se kao netočno.

Ako $ MissingFiles postoji i nije nula, Write-Host će objaviti poruku koja vam govori koliko je datoteka nestalo i da će skripta prekinuti. Zatim će Remove-Variable izbrisati sve varijable koje smo stvorili i Exit će napustiti skriptu. Na redovitoj PowerShell konzoli Remove-Variable nije stvarno potrebna za ovu posebnu namjenu jer se varijable postavljene skriptama obično odbacuju kada skripta izlazi. Međutim, PowerShell ISE se ponaša malo drugačije, pa biste to htjeli zadržati ako planirate pokrenuti skriptu od tamo.

Ako su sve u redu, skripta će se nastaviti. Još jedna priprema za napraviti je alias koji će nam biti drago što ćemo kasnije.

New-alias g Get-Random

Alias ​​se koriste za stvaranje alternativnih imena za naredbe. To može biti korisno kako bismo se upoznali s novim sučeljem( npr. PowerShell ima ugrađene pseudonime poput dir - & gt; Get-ChildItem i cat - & gt; Get-Content )za uobičajene naredbe. Ovdje izrađujemo vrlo kratku ruku za Get-Random naredbu koja će se koristiti puno kasnije.

Get-Random ljepušan velik dio čini ono što njeno ime implicira. S obzirom na niz( poput popisa imena) kao unos, odabire slučajnu stavku iz polja i izbaci je. Također se može koristiti za generiranje slučajnih brojeva. Ono što se treba sjetiti o Get-Random i brojevima ipak je da, kao i mnoge druge računalne operacije, počinje računati od nule. Dakle, umjesto Get-Random 10 što znači prirodnije "dajte mi broj od 1 do 10" to zaista znači "dajte mi broj od 0 do 9." Možete biti specifičniji oko odabira broja, tako da Get-Random se ponaša više kao što biste prirodno očekivali, ali to nam neće trebati u ovoj skripti.

Dio 2: Dobivanje korisničkog unosa i dobivanje posla

Dok skriptu generira samo jedno slučajno ime &broj telefona je odličan, puno je bolje ako skripta omogući korisniku da odredi koliko imena &brojeve koje žele dobiti u jednoj seriji. Nažalost, ne možemo zaista vjerovati korisnicima da uvijek daju valjane podatke. Dakle, ovdje je malo više nego samo $ UserInput = Read-Host .

dok( ! $ ValidInput){ pokušaj{ [int] $ UserInput = čita-Host -Prompt 'Stavke koje treba generirati' $ ValidInput = $ true} catch{ Write-Host 'Invalid input. Unesite samo broj. "-ForegroundColor Red}}

Dok istodobna izjava nadzire i negira vrijednost $ ValidInput. Sve dok je $ ValidInput lažan, ili ne postoji, zadržat će petlje kroz blok skripte.

Pokušaj izjava uzima korisnički unos, putem Read-Host, i pokušava ga pretvoriti u cijelu vrijednost.(To je [int] prije Read-Host-a.) Ako je to uspješno, postavit će $ ValidInput na true, tako da se petlja može izaći. Ako nije uspjelo, blok ulova postavlja pogrešku i, budući da se $ ValidInput nije postao postavljen, petlja će se vratiti i ponovo potaknuti korisnika.

Nakon što je korisnik pravilno dao broj kao unos, želimo da skripta objavljuje da će uskoro započeti raditi, a zatim se o tome obaviti.

Write-Host "` nGeneriranje $ UserInput imena i telefonskih brojeva. Budite strpljivi. `N" 1. . $ UserInput |Za svaki objekt{ & lt; # INSERT RANDOM NAME &GENERATOR NUMBER OVDJE # & gt;}

Ne brinite, nećemo vas ostaviti sami kako bismo shvatili slučajno ime &broj generatora koda. To je samo zamjenski komentar koji će vam pokazati gdje će sljedeći odjeljak( gdje se pravi posao obavlja) idući.

Redak pisanja-host je prilično jednostavan. Jednostavno kaže koliko će imena i telefonskih brojeva generirati skriptu, a korisnik traži da budu strpljivi dok skripta radi svoj posao. `n na početku i kraju niza je umetnuti praznu liniju prije i poslije tog izlaza, samo da bi mu dali vizualno razdvajanje između ulazne linije i popisa imena &brojevi. Budite svjesni da je to back-tick( AKA "ozbiljan naglasak" - obično ključ iznad kartice, lijevo od 1), a ne apostrof ili pojedinačni citat ispred svakog n .

Sljedeći dio pokazuje drugačiji način na koji možete koristiti petlju ForEach-Object. Tipično, kada želite da se skriptni blokira određeni broj puta, postavit ćete redovite za petlju poput za( $ x = 1; $ x -le $ UserInput; $ x ++){ & lt; # INSERT SCRIPTOvdje # & gt;}. ForEach-Object nam omogućava pojednostavljenje tako da je unosimo popis cjelobrojnih brojeva, a umjesto da nam kažemo da zapravo nešto poduzmemo s tim brojem cijelih brojeva, samo joj dajemo statički blok skripte koji će se izvoditi dok ne ponestane čitavih brojeva za to.

Dio 3: Izrada naziva savijač

Generiranje imena je najjednostavniji dio ostatka ovog procesa. Sastoji se od tri koraka: odabira prezimena, odabira spola i odabira imena. Imajte na umu da smo stvorili pseudonim za Get-Random za neko vrijeme? Vrijeme je da se počnete koristiti.

$ Prezime = Get-Content "$ ScriptFolder \ Surnames.txt" |g $ Muški = g 2 ako( $ muški){ $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" |g} else{ $ FirstName = Get-Sadržaj "$ ScriptFolder \ Females.txt" |g}

Prva crta vodi naš popis prezimena, hrani ga u slučajni berač i dodjeljuje odabrano ime za $ Prezime.

Druga crta odabire rod naše osobe. Sjećate se kako Get-Random počinje računati od nule, i kako je nula lažna, a sve ostalo je istina? Tako upotrebljavamo Get-Random 2 ( ili puno kraći g 2 zahvaljujući našem pseudom - što rezultira izborom između nula ili jednog) da odlučimo je li naša osoba muška ili nije. If / else izjava nakon toga slučajno odabere muško ili žensko ime u skladu s tim.

Dio 4: Generiranje slučajnog telefonskog broja

Ovdje je stvarno zabavan dio. Ranije smo vam pokazali kako postoji nekoliko načina na koje možete unijeti nevažeći ili fiktivni telefonski broj. Budući da ne želimo da svi naši brojevi izgledaju previše slični jedni drugima, svaki put ćemo slučajno odabrati format nevažećeg broja. Nasumično odabrani formati definirat će se njihovim prečacnim kodom i burzovnim kodom koji će zajedno biti pohranjeni kao $ prefiks.(G 10) $( g 10)) $( g 10) $( g 10) $( g 10) $( g 10) $( g 10) $( g 10) $( g 10)($ 10) $( g 10) $( g 10) $( g 10) $( g 10) $ 2 ${ $ Prefix = "($ 10)(g 10) $( g 10) $( g 10) $( g 10)) $( g 2) $( g 10) $( g 10)) $ 1( $ 10) $( g 10) $ "($ 10) $( g 10) $( g 10)) 555"}}

Prva linija je jednostavna generacija slučajnih brojeva za odabir formataslijedit ćemo za telefonski broj. Zatim, prijelazni iskaz uzima slučajni odabir i generira prefiks $ u skladu s tim. Imate li na umu taj popis nevažećih telefonskih brojeva? Vrijednosti $ NumberFormat 0-3 odgovaraju prva četiri na tom popisu. Vrijednost 4 može generirati jedno od posljednja dva jer oba koriste "Exchange 555" kod.

Ovdje također možete vidjeti da koristimo još jedan trik s dvostrukim navodnicima. Dvostruki navodi ne dopuštaju samo tumačenje varijabli prije nego što niz dobije izlaz - oni također omogućuju obradbu blokova skripte. Da biste to učinili, umetnite blok skripta kao što je ovaj: "$( & lt; #SCRIPT HERE # & gt;)" .Dakle, ono što imate iznad je mnogo pojedinačno randomiziranih znamenki, od kojih su neki ograničeni ili postavljeni statistički prema pravilima koja trebamo slijediti. Svaki niz ima i zagradama i razmak kao što biste inače očekivali u paru kod za predbroj i kod razmjene kodova.

Zadnja stvar koju moramo učiniti prije nego što budemo spremni izdati naše ime &telefonski broj je generirati Pretplatnički ID, koji će biti pohranjen kao $ sufiks.($ 10) $( g 10) $( g 10) $( g 10) "} 4{ prekidač( $ prefiks){ '(800) 555 '{$ Suffix =' 0199 '} zadano{ $ Suffix = "01 $( g 10) $( g 10)"}}}}

Zbog posebnih pravila za 555 brojeva ne možemogenerirati četiri slučajne znamenke za kraj svakog telefonskog broja koji će naša skripta napraviti. Dakle, prva kontrola provjerava da li se radi o broju 555.Ako ne, generira četiri slučajne znamenke. Ako je broj 555, druga prekidač provjerava 800 predbroj. Ako se to podudara, postoji samo jedan valjani sufiks koji možemo upotrijebiti. U suprotnom, dopušteno je odabrati nešto od 0100-0199.

Imajte na umu da postoji nekoliko različitih načina na koje bi ovaj blok mogao biti napisan, umjesto na koji način. Obje prijelazne izjave mogle su biti zamijenjene s izjavama "if / else", budući da one imaju samo dva izbora. Također, umjesto da se izričito nazove "4" kao opciju za prvu izjavu prekidača, "zadana" mogla je biti korištena slično načinu na koji je to učinjeno u drugom jer je bila jedina opcija preostala. Izbor između if / else vs. switch ili gdje koristiti zadanu ključnu riječ umjesto specifičnih vrijednosti često se svodi na stvar osobnih preferencija. Sve dok to radi, upotrijebite sve što vam najviše odgovara.

Sada je vrijeme za izlaz.

Write-Output "$ FirstName $ Prezime $ Prefix- $ sufiks"}

Ovaj je ljepušan velik dio toliko jednostavan kao što dobiva u skripti. Ona samo izlaze ime i prezime odvojene razmakom, a zatim još jedan prostor prije telefonskog broja. Evo gdje se dodaje i standardna crtica između Exchange Code i Subscriber ID.

Taj zatvarajući nosač na dnu je kraj petlje ForEach-Object od ranijih - zanemarite ovo ako ste ga već dobili.

Dio 5: Čišćenje i izvođenje skripte

Nakon što je obavljen sav posao, dobra skripta zna kako očistiti nakon sebe. Opet, promjena varijable u nastavku nije stvarno potrebna ako samo pokrenete skriptu s konzole, ali ćete ga poželjeti ako ikada planirate pokrenuti ga u ISE.

Ukloni - alias stavke: \ g Remove-Variable ScriptFolder, zahtijevane datoteke, prezime, muški, FirstName, format broja, prefiks, sufiks, ValidInput, UserInput

Nakon što ste gotovi sve učinili, spremite skriptu s nastavkom ".ps1"u istoj mapi kao i vaši nazivi datoteka. Provjerite je li izvršna pravila postavljena tako da skripta može pokrenuti i dati joj vrtlog.

Evo snimka zaslona skripte u akciji:

Također možete preuzeti ZIP datoteku koja sadrži ovu PowerShell skriptu i tekstualne datoteke s popisa imena, od donje veze.

Nasumično ime &Generator telefonskog broja za PowerShell