Kako generirati slučajna imena i telefonske brojeve uz PowerShell
Kada vam je potreban skup podataka za testiranje ili demonstraciju, a taj skup mora predstavljati podatke koji omogućuju identifikaciju osobe (PII), obično ne želite koristiti stvarne podatke koji predstavljaju stvarne osobe. Ovdje ćemo vas proučiti kako možete koristiti PowerShell za generiranje popisa slučajnih imena i telefonskih brojeva za takvu priliku.
Što trebaš
Prije nego počnete, postoje neki alati i informacije koje biste trebali imati:
PowerShell
Ova je skripta razvijena korištenjem PowerShell 4.0 i testirana je na kompatibilnost s PowerShellom 2.0. PowerShell 2.0 ili noviji je ugrađen u Windows od Windowsa 7. Također je dostupan za Windows XP i Vista kao dio Windows Management Framework (WMF). U nastavku su navedene neke dodatne pojedinosti i veze za preuzimanje.
- PowerShell 2.0 dolazi sa sustavom Windows 7. Korisnici sustava Windows XP SP3 i Vista (SP1 ili noviji) mogu preuzeti odgovarajuću verziju WMF-a od tvrtke Microsoft u KB968929. Nije podržan na XP SP2 ili niže, ili Vista bez SP1.
- PowerShell 4.0 dolazi sa sustavom Windows 8.1. Korisnici sustava Windows 7 SP1 mogu ga nadograditi kao dio ažuriranja WMF-a iz Microsoftova centra za preuzimanje. Nije dostupno za XP ili Vista.
imena
Trebat će vam neki popisi imena za unos u generator slučajnih podataka. Izvrstan izvor za mnogo imena i informacije o njihovoj popularnosti (iako to neće biti korišteno za ovu skriptu), je Ured za popis stanovništva Sjedinjenih Američkih Država. Popisi dostupni na linkovima ispod su vrlo veliki, pa ih možete malo smanjiti ako planirate generirati puno imena i brojeva odjednom. Na našem testnom sustavu, za svaki par imena i brojeva bilo je potrebno oko 1,5 sekunde za generiranje pomoću potpunih popisa, ali će vaša kilometraža varirati ovisno o vlastitim specifikacijama sustava.
- prezimena
- Muška imena
- Ženska imena
Bez obzira na izvor koji koristite, trebat ćete generirati tri tekstualne datoteke koje skripta može koristiti kao bazu za odabir imena. Svaka datoteka treba sadržavati samo imena i samo jedno ime po retku. Njih treba pohraniti u istu mapu kao i PowerShell skriptu.
Surnames.txt treba sadržavati prezimena iz kojih želite odabrati skriptu. Primjer:
Smith Johnson Williams Jones Brown
Males.txt treba sadržavati muška imena koja želite da skripta odabere. Primjer:
James John Robert Michael William
Females.txt treba sadržavati ženska imena koja želite da skripta odabere. Primjer:
Mary Patricia Linda Barbara Elizabeth
Pravila za telefonske brojeve
Ako želite biti sigurni da se vaši telefonski brojevi ne podudaraju s ničim pravim telefonskim brojem, najlakši je način da koristite dobro poznati "555" Exchange Code. Ali ako ćete prikazivati skup podataka s mnogo telefonskih brojeva, 555 će vrlo brzo početi izgledati prilično monotono. Da bismo stvari učinili zanimljivijima, generirat ćemo druge brojeve telefona koji krše pravila Sjevernoameričkog plana numeracije (NANP). U nastavku su navedeni neki primjeri nevažećih telefonskih brojeva koji predstavljaju svaku klasu broja koja će generirati ova skripta:
- (157) 836-8167
Taj je broj nevažeći jer područni kodovi ne mogu započeti s 1 ili 0. - (298) 731-6185
Ovaj broj je nevažeći jer NANP ne dodjeljuje pozivne brojeve s 9 kao drugu znamenku. - (678) 035-7598
Taj je broj nevažeći jer razmjena kodova ne može započeti s 1 ili 0. - (752) 811-1375
Taj je broj nevažeći jer kodovi za razmjenu ne mogu završiti s dva 1s. - (265) 555-0128
Taj je broj nevažeći jer je kod za razmjenu 555, i Pretplatnički ID je unutar raspona koji je rezerviran za izmišljene brojeve. - (800) 555-0199
Taj je broj jedini broj od 800 s kodom za razmjenu 555 koji je rezerviran za upotrebu kao izmišljeni broj.
Imajte na umu da su gore navedena pravila podložna promjenama i mogu varirati ovisno o nadležnosti. Trebali biste napraviti vlastito istraživanje da biste provjerili trenutna pravila koja se odnose na mjesto na kojem ćete generirati telefonske brojeve.
Zajedničke naredbe
Postoje neke prilično uobičajene naredbe koje će se koristiti kroz ovu skriptu, tako da biste trebali dobiti osnovnu ideju o tome što to znači prije nego što uđemo u pisanje.
- Foreach-objekt uzima niz ili popis objekata i izvršava navedenu operaciju na svakom od njih. Unutar bloka skripte ForEach-objekta, varijabla $ _ koristi se za upućivanje na trenutnu stavku koja se obrađuje.
- ako… drugo Izjave vam omogućuju da izvršite operaciju samo ako su zadovoljeni određeni uvjeti i (opcionalno) odredite što treba učiniti kada taj uvjet nije ispunjen.
- prekidač Izjave su kao ako izjave s više izbora. Prekidač će provjeriti objekt na nekoliko uvjeta i pokrenuti bilo koje skriptne blokove specificirane za uvjete koje objekt odgovara. Također možete, opcionalno, specificirati zadani blok koji će se izvoditi samo ako se ne podudaraju drugi uvjeti. Switch naredbe također koriste varijablu $ _ za upućivanje na trenutnu stavku koja se obrađuje.
- dok Izjave omogućuju kontinuirano ponavljanje bloka skripti tako dugo dok je zadovoljen određeni uvjet. Kada se nešto dogodi što uzrokuje da uvjet više ne bude istinit kada je blok skripte završen, petlja izlazi.
- pokušaj uhvatiti izjave pomažu u obradi pogrešaka. Ako nešto pođe po zlu s blokom skripte određenim za pokušaj, pokrenut će blok za ulov.
- Get-Sadržaj radi ono što piše na limu. Ona dobiva sadržaj određenog objekta - obično datoteku. To se može koristiti za prikaz sadržaja tekstualne datoteke na konzoli ili, kao u ovoj skripti, prosljeđivanje sadržaja duž cjevovoda koji će se koristiti s drugim naredbama.
- Pisanje-Host stavlja stvari u konzolu. To se koristi za predstavljanje poruka korisniku i nije uključeno u izlaz skripte ako se izlaz preusmjerava.
- Pisanje-izlaz zapravo generira izlaz. Normalno, ovo se baca na konzolu, ali se također mogu preusmjeriti drugim naredbama.
U skripti postoje i druge naredbe, ali one ćemo objasniti dok idemo.
Izrada scenarija
Sada je vrijeme da se ruke uprljaju.
Dio 1: Priprema za pokretanje
Ako želite da se vaša skripta počne prikazivati iz čiste konzole, ovdje je prva linija koju želite u njoj.
Vedro-Host
Sada kada imamo čist zaslon, sljedeća stvar koju želimo je provjeriti skriptu kako bi se uvjerili da je sve potrebno. Da bismo to učinili, moramo početi tako što ćemo mu reći gdje da gledamo i što tražiti.
$ ScriptFolder = Split-Put $ MyInvocation.MyCommand.Definition -Parent $ RequiredFiles = ('Males.txt', 'Females.txt', 'Names.txt')
Prvi redak je vrlo koristan za bilo koju skriptu. Definira varijablu koja pokazuje na mapu koja sadrži skriptu. To je neophodno ako vašoj skripti trebaju druge datoteke koje se nalaze u istom direktoriju kao i samom sebi (ili poznatom relativnom putu iz tog direktorija), jer ćete inače naići na pogreške ako i kada pokušate pokrenuti skriptu dok ste u drugoj radni direktorij.
Drugi redak stvara niz naziva datoteka koji su potrebni za ispravno pokretanje skripte. Koristit ćemo to, zajedno s varijablom $ ScriptFolder, u sljedećem komadu gdje ćemo provjeriti jesu li te datoteke prisutne.
$ RequiredFiles | Za svaki objekt if (! (Test-Path "$ ScriptFolder \ _")) Write-Host "$ _ not found." -ForegroundColor Red $ MissingFiles ++
Ovaj blok skripte šalje $ RequiredFiles polje u blok ForEach-objekta. Unutar tog bloka skripte, if izjava koristi Test-Path da vidi je li datoteka koju tražimo mjesto gdje pripada. Test-Path je jednostavna naredba koja, kada je zadana putanja datoteke, vraća osnovni istinski ili lažni odgovor kako bi nam pokazao da li put ukazuje na nešto što postoji. Uskličnik je ovdje ne operator, koji preokreće odgovor Test-Path prije nego ga proslijedi na if izjavu. Dakle, ako Test-Path vraća false (to jest, datoteka koju tražimo ne postoji), bit će pretvorena u true tako da će if izraz izvršiti svoj blok skripte.
Još jedna stvar koju ovdje treba napomenuti, koja će se često koristiti u ovoj skripti, jest korištenje dvostrukih navodnika umjesto jednostrukih navodnika. Kada stavite nešto u jednostruke navodnike, PowerShell ga tretira kao statički niz. Što god se nalazi u pojedinačnim navodnicima, proći će točno onako kako jest. Dvostruke navodne govori PowerShellu da prevede varijable i neke druge posebne stavke unutar niza prije nego što ih proslijedi. Ovdje dvostruki navodnici to znače umjesto trčanja Test-Path '$ ScriptFolder \ t zapravo ćemo raditi nešto više Test-Path 'C: Skripte (pod pretpostavkom da je vaša skripta u C: Skripte, a ForEach-Objekt trenutno radi na 'Names.txt').
Za svaku datoteku koja nije pronađena, Write-Host će objaviti poruku o pogrešci crvenom bojom kako bi vam rekao koja datoteka nedostaje. Zatim povećava varijablu $ MissingFiles koja će se koristiti u sljedećem komadu, do pogreške i prekida ako nedostaju datoteke.
if ($ MissingFiles) Write-Host "Nije moguće pronaći izvorne datoteke $ MissingFiles. Prekida skriptu." -ForegroundColor Crvena mapa za uklanjanje varijable, obavezna polja, izlaz iz nestalih datoteka
Evo još jednog urednog trika koji možete učiniti s izjavama. Većina vodiča ćete vidjeti o tome ako će vam naredbe reći da koristite operatora za provjeru odgovarajućeg stanja. Na primjer, ovdje bismo mogli koristiti ako ($ MissingFiles -gt 0) da biste vidjeli je li $ MissingFiles veći od nule. Međutim, ako već koristite naredbe koje vraćaju boolean vrijednost (kao u prethodnom bloku gdje smo koristili Test-Path) to nije potrebno. Također možete bez nje u slučajevima kao što je ovaj, kada samo testirate da vidite je li broj ne-nula. Bilo koji broj koji nije nula (pozitivan ili negativan) tretira se kao istinit, dok se nula (ili, kao što se ovdje može dogoditi, nepostojeća varijabla) tretira kao lažna.
Ako $ MissingFiles postoji, a nije jednak nuli, Write-Host će objaviti poruku s podacima o tome koliko datoteka nedostaje i da će skripta prekinuti. Zatim će Remove-Variable očistiti sve varijable koje smo stvorili i Exit će zatvoriti skriptu. Na redovitoj PowerShell konzoli, Remove-Variable zapravo nije potrebna za tu određenu svrhu jer su varijable postavljene skriptama obično odbačene kada skripta napusti. Međutim, PowerShell ISE se ponaša malo drugačije tako da ga možete zadržati ako planirate izvesti skriptu odatle.
Ako su sve stvari u redu, skripta će se nastaviti. Još jedna priprema za napraviti je pseudonim koji će nam biti jako drago kasnije.
Novi-Alias g Get-Random
Pseudonimi se koriste za stvaranje alternativnih imena za naredbe. To može biti korisno da nam pomogne da se upoznamo s novim sučeljem (npr .: PowerShell ima ugrađene aliase poput dir -> Get-ChildItem i cat -> Get-Content) ili za izradu kratkih referenci za uobičajene naredbe. Evo, stvaramo vrlo kratka referenca za Get-ovoj naredbu koja će se mnogo kasnije koristiti.
Get-Random ljepušan velik dio čini ono što njegovo ime implicira. S obzirom na polje (kao popis imena) kao ulaz, on bira slučajnu stavku iz niza i ispljuna je. Također se može koristiti za generiranje slučajnih brojeva. Zapamtite o Get-Random i brojevima je da, poput mnogih drugih računalnih operacija, počinje brojati od nule. Dakle, umjesto Get-Random 10 što znači da je prirodnije "dajte mi broj od 1 do 10", to uistinu znači "dajte mi broj od 0 do 9." Možete biti precizniji u odabiru broja, tako da se Get-Random ponaša više poput vas očekivati, ali to nećemo trebati u ovoj skripti.
Dio 2: Dobivanje korisničkog unosa i dolazak na posao
Dok je skripta koja generira samo jedan nasumični naziv i telefonski broj odlična, mnogo je bolje ako skripta dopušta korisniku da odredi koliko imena i brojeva želi dobiti u jednoj seriji. Nažalost, ne možemo pouzdati korisnike da uvijek daju valjane unose. Dakle, malo je više od ovoga $ UserInput = Read-Host.
dok (! $ ValidInput) try [int] $ UserInput = Read-Host -Prompt 'Stavke koje treba generirati' $ ValidInput = $ true catch Write-Host 'Neispravan unos. Unesite samo broj. ' -ForegroundColor Red
Izjava while provjerava i negira vrijednost $ ValidInput. Sve dok je $ ValidInput lažna, ili ne postoji, zadržat će petlje kroz blok skripte.
Izjava try uzima korisnički unos putem Read-Hosta i pokušava ga pretvoriti u cjelobrojnu vrijednost. (To je [Int] prije Read-Host.) Ako je uspješan, postavit će $ ValidInput na true tako da petlja while može izaći. Ako ne uspije, blok za ulov objavljuje pogrešku i, budući da $ ValidInput nije postavljen, petlja while će se vratiti i ponovno potaknuti korisnika.
Kada korisnik pravilno unese broj kao ulaz, želimo da skripta najavi da će početi raditi svoj posao, a zatim će to učiniti.
Write-Host "'nGenerating $ UserInput imena i telefonski brojevi. Molim vas budite strpljivi." 1 ... $ UserInput | ForEach-Object
Ne brinite, nećemo vas ostaviti sami da otkrijete šifru generatora slučajnih imena i brojeva. To je samo komentar rezerviranog mjesta koji će vam pokazati gdje će se sljedeći odjeljak (gdje se pravi posao završi) uklopiti.
Linija Write-Host je prilično jednostavna. Ona jednostavno kaže koliko imena i telefonskih brojeva će skripta generirati, i traži od korisnika da bude strpljiv dok skripta radi svoj posao.„n na početku i kraju niza treba umetnuti prazan redak prije i poslije tog izlaza, samo da bi se dobio vizualni razmak između ulazne linije i popisa imena i brojeva. Budite svjesni da je to povratna kvačica (AKA "ozbiljan naglasak" - obično ključ iznad kartice, lijevo od 1), a ne apostrof ili pojedinačni citat ispred svakog n.
Sljedeći dio prikazuje drukčiji način na koji možete koristiti petlju Oblikovanje objekata. Obično, kada želite da se blok skripte izvodi određeni broj puta, postavit ćete regularni za petlju slično za ($ x = 1; $ x -le $ UserInput; $ x ++) . ForEach-Object omogućuje nam da ga pojednostavimo tako da joj dodamo popis cijelih brojeva i umjesto da mu kažemo da zapravo radi s tim cijelim brojevima, jednostavno mu dajemo blok za statičku skriptu za pokretanje dok ne ponestane cjelovitih brojeva za to.
Dio 3: Generiranje slučajnog imena
Generiranje imena najjednostavniji je dio ostatka procesa. Sastoji se samo od tri koraka: odabira prezimena, odabira spola i odabira imena. Sjećaš se onoga što smo napravili za Get-Random? Vrijeme je da to počnete koristiti.
$ Varijante = Get-Content "$ ScriptFolder \ t g $ Muško = g 2 if ($ Muško) $ FirstName = Get-Content "$ ScriptFolder Males.txt" | g drugo $ FirstName = Get-Content "$ ScriptFolder Females.txt" | g
Prvi redak uzima naš popis prezimena, šalje ga u slučajni izbornik i dodjeljuje odabrano ime $ Prezime.
Drugi red odabire spol osobe. Zapamtite kako Get-Random počinje brojati od nule, i kako je nula lažna i sve ostalo je istina? Tako koristimo Get-Random 2 (ili mnogo kraći g 2 zahvaljujući našem pseudonimu - oba rezultiraju izborom između nule ili jednog) da odlučimo je li naša osoba muškarac ili ne. Izjava if / else nakon toga nasumce bira muško ili žensko ime.
Dio 4: Generiranje slučajnog broja telefona
Ovo je stvarno zabavan dio. Ranije smo vam pokazali kako postoji nekoliko načina na koje možete napraviti nevažeći ili izmišljeni telefonski broj. Budući da ne želimo da svi naši brojevi izgledaju previše slično jedan drugome, svaki put ćemo slučajno odabrati nevažeći format broja. Nasumično odabrani formati bit će definirani njihovim kodom područja i kodom za razmjenu, koji će zajedno biti pohranjeni kao $ Prefix.
$ NumberFormat = g 5 prekidač ($ NumberFormat) 0 $ Prefiks = "($ (g 2) $ (g 10) $ (g 10)) $ (g 10) $ (g 10) $ (g 10)" 1 $ Prefix = "($ (g 10) 9 $ (g 10)) $ (g 10) $ (g 10) $ (g 10)" 2 $ Prefix = "($ (g 10) $ (g 10) $ (g 10)) $ (g 2) $ (g 10) $ (g 10) " 3 $ Prefiks =" ($ (g 10) $ (g 10) $ (g 10)) $ (g 10) 11 " 4 $ Prefix =" ($ (g 10) $ (g 10) $ (g 10)) 555 "
Prvi je redak generiranja slučajnih brojeva koji će odabrati format koji ćemo slijediti za broj telefona. Zatim, switch stavka uzima taj slučajni izbor i generira $ Prefix u skladu s tim. Sjećate li se popisa nevažećih vrsta telefonskih brojeva? Vrijednosti $ NumberFormat 0-3 odgovaraju prvim četirima na tom popisu. Vrijednost 4 može generirati jednu od posljednje dvije, budući da obje koriste “555” Exchange Code.
Ovdje također možete vidjeti da koristimo drugi trik s dvostrukim navodnicima. Dvostruki navodnici ne omogućuju samo interpretiranje varijabli prije nego što string dobije izlaz - oni vam također omogućuju obradu blokova skripti. Da biste to učinili, omotajte blok skripte ovako: „$ ()”. Dakle, ono što imate gore je puno pojedinačno randomiziranih znamenki, od kojih su neke ili ograničene u svom rasponu ili statički postavljene prema pravilima koje trebamo slijediti. Svaki niz ima i zagrade i razmake kao što biste inače očekivali da ćete vidjeti u paru koda područja i koda za razmjenu.
Zadnje što trebamo učiniti prije nego što budemo spremni za prikaz našeg imena i broja telefona je generiranje pretplatničkog ID-a, koji će biti pohranjen kao $ Suffix.
switch ($ NumberFormat) $ _ -lt 4 $ Suffix = "$ (g 10) $ (g 10) $ (g 10) $ (g 10)" 4 switch ($ Prefix) '( 800) 555 '$ Suffix =' 0199 ' zadano $ Suffix = "01 $ (g 10) $ (g 10)"
Zbog posebnih pravila za 555 brojeve, ne možemo samo generirati četiri nasumične znamenke za kraj svakog telefonskog broja kojeg će naša skripta napraviti. Dakle, prvi prekidač provjerava radi li se o broju 555. Ako ne, generira četiri nasumične znamenke. Ako je broj 555, drugi prekidač provjerava pozivni broj 800. Ako se to podudara, postoji samo jedan važeći $ Suffix koji možemo koristiti. Inače, dopušteno je odabrati bilo što između 0100-0199.
Imajte na umu da postoji nekoliko različitih načina na koje je ovaj blok mogao biti napisan, umjesto na način na koji je. Oba switch izraza mogla su biti zamijenjena s if / else izjavama, budući da svaka od njih obrađuje samo dva izbora. Isto tako, umjesto da izričito nazovete "4" kao opciju za prvu izjavu o prekidaču, "zadano" se moglo koristiti slično onome kako je to učinjeno u drugoj jer je to bila jedina preostala opcija. Izbor između if / else vs switch, ili gdje se koristi zadana ključna riječ umjesto specifičnih vrijednosti, često se svodi na pitanje osobnih preferencija. Tako dugo dok radi, upotrijebite sve što vam najviše odgovara.
Sada je vrijeme za izlaz.
Write-Output "$ FirstName $ Preferencija $ Prefix - $ Sufiks"
Ovaj je prilično jednostavan kao što dobiva u skripti. Samo izlazi ime i prezime odvojeno razmacima, zatim drugi prostor ispred telefonskog broja. Ovdje se dodaje i standardna crtica između koda za Exchange i ID pretplatnika.
Ta zaključna zagrada na dnu je kraj petlje ForEach-Object od ranije - izostavite ovo ako je već imate.
Dio 5: Čišćenje i pokretanje skripte
Nakon što je sav posao završen, dobar scenarij zna kako očistiti nakon sebe. Opet, uklanjanje varijable ispod nije stvarno potrebno ako samo želite pokrenuti skriptu s konzole, ali ćete je poželjeti ako je planirate pokrenuti u ISE-u.
Uklonite pseudonim stavke: g uklanjanjem-varijablu skriptnu mapu, zahtijevane datoteke, prezime, muški, ime, brojčani oblik, prefiks, sufiks, valjan unos, korisnički unos
Nakon što ste sve učinili, spremite skriptu s nastavkom ".ps1" u istu mapu kao i datoteke s imenima. Provjerite je li vaš ExecutionPolicy postavljen tako da skripta može raditi, i dajte joj vrtlog.
Evo snimke zaslona skripte u akciji:
Također možete preuzeti ZIP datoteku koja sadrži ovu skriptu PowerShell i tekstualne datoteke s popisima imena s donje veze.
Generator slučajnih imena i telefonskih brojeva za PowerShell