Kako generirati slučajna imena i brojeve telefona pomoću programa PowerShell

Sadržaj:

Kako generirati slučajna imena i brojeve telefona pomoću programa PowerShell
Kako generirati slučajna imena i brojeve telefona pomoću programa PowerShell

Video: Kako generirati slučajna imena i brojeve telefona pomoću programa PowerShell

Video: Kako generirati slučajna imena i brojeve telefona pomoću programa PowerShell
Video: Top 9 Amazing Woodworking Tools to Buy Online - YouTube 2024, Svibanj
Anonim
Kada vam je potreban skup podataka za testiranje ili demonstraciju, a taj skup mora predstavljati informacije o osobnom identifikaciji (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.
Kada vam je potreban skup podataka za testiranje ili demonstraciju, a taj skup mora predstavljati informacije o osobnom identifikaciji (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 trebaš

Prije nego što započnete, postoje neki alati i informacije koje biste trebali imati:

PowerShell

Ova je skripta razvijena korištenjem PowerShell 4.0, a također je testirana i 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. Dobar izvor za mnogo imena i 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.

  • prezimena
  • 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 treba sadržavati prezimena za koje skriptu želite odabrati. Primjer:

Smith Johnson Williams Jones Brown

Males.txt treba sadržavati muška imena koja želite odabrati. Primjer:

James John Robert Michael William

Females.txt treba sadržavati ženska imena koja želite odabrati skriptu. Primjer:

Mary Patricia Linda Barbara Elizabeth

Pravila za telefonske brojeve

Ako želite biti sigurni da se vaši telefonski brojevi ne podudaraju s bilo kojim stvarnim brojem telefona, najlakši je način da koristite poznati "555" Exchange Code. 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). Ispod su neki uzorci nevažeći telefonski brojevi, koji predstavljaju svaku klasu broja koji će generirati ova skripta:

  • (157) 836-8167 Ovaj broj je nevažeći jer Prekršajni kodovi ne mogu započeti sa 1 ili 0.
  • (298) 731-6185 Taj je broj 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 sa 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 Exchangeov kod 555, i ID pretplatnika je unutar raspona rezerviranog za fiktivne brojeve.
  • (800) 555-0199 Ovaj broj je jedini broj 800 s 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 prema 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 pisanje.

  • Foreach-objekt 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 da 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.
  • dok Izjave omogućuju neprekidno ponavljanje skripte blok tako dugo dok se zadovolje 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 pomažu pri upravljanju pogreškama. Ako nešto krene u krivu s blokom skripte navedenoj za pokušaj, blok ulova će se pokrenuti.
  • Get-Sadržaj čini ono što kaže na kositru.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.
  • Pisanje-Host stavlja stvari u konzolu. Ovo se koristi za prikazivanje poruka korisniku i nije uključeno u izlaz skripte ako se izlaz preusmjerava.
  • Pisanje-izlaz zapravo generira output. Normalno, to se baca na konzolu, ali može biti preusmjereno i drugim naredbama.

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

Izgradnja skripte

Sada je vrijeme da prljavimo ruke.

Dio 1: Dobivanje spremnosti za odlazak

Ako vam se svidjela skripta da počnete prikazivati sa č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 provjeriti časopis kako bismo osigurali da mu 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 linija je 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 drugom radni imenik.

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

$RequiredFiles | ForEach-Object { if (!(Test-Path '$ScriptFolder$_')) { Write-Host '$_ not found.' -ForegroundColor Red $MissingFiles++ } }

Taj 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. Usklađivanje u toj je a ne operator koji zaustavlja 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 citati znače da umjesto trčanja Test-Path '$ ScriptFolder $ _' mi zapravo radimo nešto slično Testni put 'C: Scripts Surnames.txt' (pretpostavljajući da je vaša skripta 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 kako bi vam rekla koja datoteka nedostaje. Zatim povećava varijablu $ MissingFiles koja će se upotrebljavati u sljedećem komadu, pogreške i prekidanje ako je nedostajala datoteka.

if ($MissingFiles) { Write-Host 'Could not find $MissingFiles source file(s). Aborting script.' -ForegroundColor Red Remove-Variable ScriptFolder,RequiredFiles,MissingFiles Exit }

Evo još jednog čistog trikova koji 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 bismo mogli koristiti ako ($ MissingFiles -gt 0) da biste vidjeli 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 -> Get-ChildItem i mačka -> Get-Content) ili napraviti kratke reference za uobičajene naredbe. Ovdje radimo a vrlo kratka referenca za Get-ovoj naredba 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 plati 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. Umjesto toga Get-Random 10 što znači da je 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 se Get-Random ponaša više kao da biste, naravno, očekuj, ali to nam neće trebati u ovoj skripti.

Dio 2: Dobivanje korisničkog unosa i dobivanje posla

Dok je skripta koja generira samo jedan slučajni naziv i telefonski broj je odličan, puno je bolje ako skripta omogući korisniku određivanje koliko imena i brojeva žele dobiti u jednoj seriji. Nažalost, ne možemo zaista vjerovati korisnicima da uvijek daju valjane podatke. Dakle, ovdje je malo više od toga $ UserInput = čitač računala.

while (!$ValidInput) { try { [int]$UserInput = Read-Host -Prompt 'Items to be generated' $ValidInput = $true } catch { Write-Host 'Invalid input. Enter a number only.' -ForegroundColor Red } }

Dok se izjava gore provjerava 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, preko 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 s radom, a zatim se o tome obaviti.

Write-Host '`nGenerating $UserInput names & phone numbers. Please be patient.`n' 1..$UserInput | ForEach-Object { <# INSERT RANDOM NAME & NUMBER GENERATOR HERE #> }

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

Redak Write-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.`nna početku i kraju niza treba umetnuti praznu liniju prije i poslije tog izlaza, samo da bi mu dali vizualno razdvajanje između ulazne linije i popisa imena i brojeva. Budite svjesni da je to back-tick (AKA "ozbiljan naglasak" - obično ključ iznad kartice, lijevo od 1), a ne apostrof ili jednokratni citat ispred svakog n.

Sljedeći dio pokazuje drugačiji način na koji možete koristiti petlju ForEach-Object. Uobičajeno, kada želite da se skriptni blok pokrene određenom broju puta, postavit ćete redovno za petlje za ($ x = 1; $ x -le $ UserInput; $ x ++) {<# INSERT SCRIPT OVDJE #>}.ForEach-Object nam omogućava da to pojednostavimo unosom popisa cjelobrojnih brojeva i, umjesto da to kažemo da zapravo nešto poduzmemo s tim brojevima, samo joj dajemo statički skriptni blok za pokretanje dok ne ponestane čitavih brojeva za to.

Dio 3: generiranje naziva s nazivom

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.

$Surname = Get-Content '$ScriptFolderSurnames.txt' | g $Male = g 2 if ($Male) {$FirstName = Get-Content '$ScriptFolderMales.txt' | g} else {$FirstName = Get-Content '$ScriptFolderFemales.txt' | g}

Prva linija vodi naš popis prezimena, hrani ga u slučajni odabir 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 mnogo kraće g 2 zahvaljujući našem pseudonim - oboje rezultiraju izborom između nula ili jednog) kako bi odlučili da li je naša osoba muška ili ne. If / else izjava nakon toga slučajno odabere muško ili žensko ime u skladu s tim.

Dio 4: Generiranje slučajnog telefonskog broja

Ovo 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 se skupno pohraniti kao $ Prefix.

$NumberFormat = g 5 switch ($NumberFormat) { 0 {$Prefix = '($(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 {$Prefix = '($(g 10)$(g 10)$(g 10)) $(g 10)11'} 4 {$Prefix = '($(g 10)$(g 10)$(g 10)) 555'} }

Prva linija je jednostavna generacija slučajnih brojeva za odabir formata za koju ćemo pratiti 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 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, zamotajte taj blok skripta ovako: "$ (<SCRIPT OVDJE #>)", 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.

Posljednja stvar koju trebamo učiniti prije nego što budemo spremni izdati ime i telefonski broj jest generiranje pretplatničkog ID-a koji će biti pohranjen kao $ sufiks.

switch ($NumberFormat) { {$_ -lt 4} {$Suffix = '$(g 10)$(g 10)$(g 10)$(g 10)'} 4 { switch ($Prefix) { '(800) 555' {$Suffix = '0199'} default {$Suffix = '01$(g 10)$(g 10)'} } } }

Zbog posebnih pravila za 555 brojeva, ne možemo generirati samo četiri slučajne znamenke za kraj svakog broja telefona koji će nam pisati. 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 da ovaj blok može 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 izričite pozivanja "4" kao opcije za prvu izjavu prekidača, "zadano" moglo bi se koristiti slično tome kako je 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 $Surname $Prefix-$Suffix' }

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 sve obavljeno, 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.

Remove-Item alias:g Remove-Variable ScriptFolder,RequiredFiles,Surname,Male,FirstName,NumberFormat,Prefix,Suffix,ValidInput,UserInput

Nakon što sve to učinite, spremite skriptu s nastavkom ".ps1" u istoj mapi kao i datoteke s imenima. Provjerite je li Vaša izvršna mreža 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, s donje veze.
Također možete preuzeti ZIP datoteku koja sadrži ovu PowerShell skriptu i tekstualne datoteke s popisa imena, s donje veze.

Generator slučajnih imena i telefonskih brojeva za PowerShell

Preporučeni: