10Sep

Kako ustvariti naključna imena in amp;Telefonske številke z PowerShell

click fraud protection

Ko potrebujete niz podatkov za testiranje ali predstavitev, in ta niz mora predstavljati osebne podatke( PII), na splošno ne želite uporabljati dejanskih podatkov, ki predstavljajo dejansko ljudi. Tukaj vas bomo preusmerili, kako lahko s PowerShellom ustvarite seznam naključnih imen in telefonskih številk za samo takšno priložnost.

Kaj potrebujete

Preden začnete, obstaja nekaj orodij in informacij, ki bi jih morali imeti:

PowerShell

Ta skript je bil razvit z uporabo PowerShell 4.0, testiran pa je bil tudi za združljivost z PowerShell 2.0.PowerShell 2.0 ali novejši je vgrajen v operacijski sistem Windows od operacijskega sistema Windows 7. Prav tako je na voljo za Windows XP in Vista kot del okvira za upravljanje Windows( WMF).Spodaj so opisane še nekatere podrobnosti in povezave za prenose.

  • PowerShell 2.0 prihaja s sistemom Windows 7. Uporabniki operacijskega sistema Windows XP SP3 in Vista( SP1 ali novejši) lahko v KB968929 prenesete ustrezno različico WMF iz Microsofta. Ni podprt na XP SP2 ali spodaj, ali Vista brez SP1.
  • instagram viewer
  • PowerShell 4.0 ima Windows 8.1.Uporabniki sistema Windows 7 s servisnim paketom SP1 lahko nadgradijo na to stran v okviru posodobitve WMF iz Microsoftovega centra za prenose. Ni na voljo za XP ali Vista.

Imena

Potrebovali boste nekaj seznamov imen, ki jih boste lahko vnesli v naključni generator. Odličen vir za veliko imen in informacije o njihovi priljubljenosti( čeprav to ne bo uporabljeno za ta scenarij), je Urad za popise Združenih držav Amerike. Seznami, ki so na voljo na spodnjih povezavah, so zelo veliki, zato jih boste morda želeli zmanjšati, če nameravate ustvariti veliko imen in številk hkrati. V našem testnem sistemu je vsak par imen / številka trajal približno 1,5 sekunde, da bi ustvaril uporabo celotnih seznamov, vendar se bo vaša kilometraža razlikovala glede na lastne sistemske lastnosti.

  • Priimki
  • Moški Prva imena
  • Ženska prva imena

Ne glede na vir, ki ga uporabljate, boste morali ustvariti tri besedilne datoteke, ki jih skript lahko uporabi kot bazene za njegovo izbiro imen. Vsaka datoteka mora vsebovati samo imena in samo eno ime na vrstico. Te jih je treba shraniti v isti mapi kot vaš PowerShell skript.

Surnames.txt mora vsebovati priimek, s katerim skript izberete. Primer:

Smith Johnson Williams Jones Brown

Males.txt mora vsebovati imena moških, ki jih želite izbrati iz skripta. Primer:

James John Robert Michael William

Females.txt naj vsebuje ženske prve ime, s katerim skript izberete. Primer:

Mary Patricia Linda Barbara Elizabeth

Pravila za telefonske številke

Če želite biti prepričani, da se vaše telefonske številke ne ujemajo z resnično telefonsko številko nikomur, je najlažje uporabiti dobro znano kodo Exchange. Ampak, če boš prikazal niz podatkov z veliko telefonskih številk, bo 555 začel izgledati precej monotono resnično hitro. Da bi bile stvari bolj zanimive, bomo ustvarili druge telefonske številke, ki kršijo pravila Severnoameriškega načrta oštevilčenja( NANP).Spodaj je nekaj vzorčnih neveljavnih telefonskih številk, ki predstavljajo vsak razred številk, ki jih bo ustvaril ta skript:

  • ( 157) 836-8167
    Ta številka je neveljavna, ker se področna koda ne more začeti z 1 ali 0.
  • ( 298) 731-6185
    Ta številka je neveljavna, ker NANP ne dodeli področnih kod z 9 kot drugo številko.
  • ( 678) 035-7598
    Ta številka ni veljavna, ker se kodi za Exchange ne morejo začeti z 1 ali 0.
  • ( 752) 811-1375
    Ta številka je neveljavna, ker se kodi Exchange ne morejo končati z dvema 1s.
  • ( 265) 555-0128
    Ta številka ni veljavna, ker je koda Exchange 555, in Subscriber ID je v območju, rezerviranem za fiktivne številke.
  • ( 800) 555-0199
    Ta številka je edina številka 800 z 555 Exchangeovo kodo, ki je rezervirana za uporabo kot fiktivna številka.

Upoštevajte, da se zgoraj navedena pravila lahko spremenijo in se lahko razlikujejo glede na pristojnost. Za lastno raziskavo bi morali preveriti veljavna pravila, ki veljajo za to lokacijo, za katero boste generirali telefonske številke.

skupni ukazi

Obstaja nekaj precej skupnih ukazov, ki se bodo uporabljali v celotnem scenariju, zato bi morali dobiti osnovno idejo o tem, kaj pomenijo, preden se potopimo v dejansko pisanje.

  • ForEach-Object sprejme matriko ali seznam predmetov in opravi določeno operacijo na vsakem od njih. V okviru skripta ForEach-Object spremenljivka $ _ se uporablja za sklicevanje na trenutno obdelan predmet.
  • , če. .. ostali izjavi omogočajo izvajanje operacije samo, če so izpolnjeni določeni pogoji in( po izbiri) določite, kaj je treba storiti, če ta pogoj ni izpolnjen. Stavek
  • Stikalo je kot, če imajo stavki več možnosti. Stikalo bo preveril predmet v več pogojih in zagnati vse skriptne blokade, ki so podani za pogoje, ki se objektu ujema. Lahko tudi po želji določite privzeti blok, ki se bo zagnal le, če se ne ujemajo nobeni drugi pogoji. Izmenjalni stavki uporabljajo tudi spremenljivko $ _, ki se nanaša na trenutno obdelan element.
  • , medtem ko izjave omogočajo nenehno ponavljanje skriptnega bloka, dokler je izpolnjen določen pogoj. Ko se zgodi nekaj, kar povzroči, da pogoj ni več veljaven, ko je blok skripta končan, zanka zapusti.
  • poskusite. .. ujeti izjave pomagajo pri ravnanju z napakami.Če karkoli gre narobe s skriptnim blokom, navedenim za poskus, se bo zagnal blok.
  • Get-Content naredi tisto, kar piše na kositra. Dobi vsebino določenega predmeta - običajno datoteko. To lahko uporabite za prikaz vsebine besedilne datoteke na konzoli ali, kot v tem skriptu, prenesite vsebino vzdolž plinovoda, ki jo želite uporabljati z drugimi ukazi.
  • Write-Host postavlja stvari v konzolo. Uporablja se za predstavitev sporočil uporabniku in ni vključena v izhod skripta, če se rezultat preusmeri.
  • Write-Output dejansko ustvari izhod. Običajno je to dampinško na konzolo, vendar ga lahko preusmerijo tudi drugi ukazi.

V skripti so še drugi ukazi, vendar bomo to razložili, ko gremo.

Izdelava skripte

Zdaj je čas, da si umazanemo.

1. del: Priprava za začetek

Če vam je všeč vaš skript za začetek delovanja s čiste konzole, tukaj je prva vrstica, ki jo želite.

Clear-Host

Zdaj, ko imamo čisti zaslon, je naslednja stvar, ki jo želimo narediti, je, ali skript preveri, kako zagotoviti, da je vse, kar potrebuje, nameščeno. Za to moramo najprej povedati, kje naj pogledamo, in kaj iskati.

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

Prva vrstica je zelo uporabna za vsak skript. Določa spremenljivko, ki kaže na mapo, ki vsebuje skript. To je ključnega pomena, če vašemu skriptu potrebujete druge datoteke, ki se nahajajo v istem imeniku kot sami( ali znana relativna pot iz tega imenika), ker boste sicer naleteli na napake, če in ko poskusite zagnati skript, medtem ko ste v drugemdelovni imenik.

Druga vrstica ustvarja niz imen datotek, ki so potrebna za pravilno izvajanje skripta. To bomo uporabili skupaj s spremenljivko $ ScriptFolder v naslednjem delu, kjer preverimo, ali so te datoteke prisotne.

$ RequiredFiles |ForEach-Object{ if( !( Preizkusna pot "$ ScriptFolder \ $ _")){ Write-Host "$ _ ni bila najdena."-ForegroundColor Red $ MissingFiles ++}}

Ta del skripte pošlje zahtevan niz podatkov $ RequiredFiles v blok ForEach-Object. Znotraj tega skriptnega bloka stavek if, ki uporablja Test-Path, da ugotovi, ali je datoteka, ki jo iščemo, tam, kjer pripada. Test-Path je preprost ukaz, ki ob datovni poti vrne osnovni dejanski ali lažen odgovor, da nam pove, ali pot kaže na nekaj, kar obstaja. Klicaj v njem je operater in ne , ki preusmeri odziv Test-Path, preden ga pošlje v izjavo o. Torej, če se testna pot vrne false( to pomeni, da datoteka, ki jo iščemo, ne obstaja), bo pretvorjena v true, tako da bo izjava izvršila svoj skriptni blok.

Druga stvar, ki jo je treba opozoriti tukaj, ki se bo pogosto uporabljala v tem skriptu, je uporaba dvojnih narekov namesto enojnih narekov. Ko postavite nekaj v enojne narekovaje, ga PowerShell obravnava kot statični niz. Karkoli je v posameznih citatih, se bo posredovalo natančno kot-je. Dvojni nareki pripovedujejo PowerShell, da prevedejo spremenljivke in nekatere druge posebne elemente v nizu, preden jih prenesejo skupaj. Tukaj dvojni nareki pomenijo, da namesto teče Test-Path "$ ScriptFolder \ $ _" dejansko naredimo nekaj več kot Test-Path "C: \ Scripts \ Surnames.txt" ( ob predpostavkiskript je v C: \ skriptih, in ForEach-Object trenutno dela na 'Surnames.txt').

Za vsako datoteko, ki ni bila najdena, bo Write-Host objavil sporočilo o napaki z rdečo, da bi vam povedal, katera datoteka manjka. Nato poveča spremenljivko $ MissingFiles, ki se bo uporabila v naslednjem delu, da napaka in zapustite, če manjkajo datoteke.

če( $ MissingFiles){ Write-Host "Ne najdem datoteke izvorne datoteke MissingFiles. Prekinitev skripta."-ForegroundColor Red Odstrani-spremenljiv ScriptFolder, RequiredFiles, MissingFiles Exit}

Tukaj je še en čisti trik, ki ga lahko naredite z izjavami. Večina vodnikov, ki jih boste videli, če vam bodo izjave sporočile, da uporabite operaterja, da preverite, ali so izpolnjeni pogoji. Na primer, tukaj bi lahko uporabili če( $ MissingFiles -gt 0) , da bi videli, ali je $ MissingFiles večji od nič.Če že uporabljate ukaze, ki vrnejo boolovo vrednost( kot v prejšnjem bloka, kjer smo uporabljali Test-Path), to ni potrebno. Prav tako lahko storite brez njega v primerih, kot je ta, ko samo preverjate, ali je številka nična. Vsako ničelno število( pozitivno ali negativno) se obravnava kot resnično, medtem ko se nič( ali, kot se lahko zgodi tukaj, neobstoječa spremenljivka) obravnavalo kot napačno.

Če $ MissingFiles obstaja in ni nič, bo Host-Write poslal sporočilo, ki vam pove, koliko datotek ni bilo, in da bo scenarij prekinil. Potem bo Remove-Variable očistil vse spremenljivke, ki smo jih ustvarili, in Exit zapusti skript. Na redni konzoli PowerShell, Remove-Variable ni res potreben za ta namen, ker spremenljivke, ki jih določijo skripti, običajno zavržejo, ko skripta zapusti. Vendar pa se PowerShell ISE obnaša nekoliko drugače, tako da boste morda želeli obdržati to, če načrtujete vodenje skripta od tam.

Če so vse stvari v redu, se scenarij nadaljuje.Še ena priprava za pripravo je vzdevek, ki ga bomo z veseljem sprejeli pozneje.

New-Alias ​​g Get-Random

Aliases se uporabljajo za ustvarjanje nadomestnih imen za ukaze. Te so lahko koristne, da nam pomagajo, da se seznanimo z novim vmesnikom( npr. PowerShell ima vgrajene vzdevke, kot so dir -> Get-ChildItem in cat -> Get-Content ) ali kratkoročne referenceza pogosto uporabljene ukaze. Tu naredimo zelo kratko referenco za Get-Random ukaz, ki ga bomo uporabili veliko kasneje.

Get-Random precej dela, kar pomeni njegovo ime. Zaradi polja( kot je seznam imen) kot vnos, izbere naključni element iz matrike in ga izplača. Lahko se uporablja tudi za generiranje naključnih števil. Stvari, ki jih je treba zapomniti o Get-Random in številke, čeprav je, da se, tako kot številne druge računalniške operacije, začne šteti od nič.Torej, namesto Get-Random 10 , kar pomeni bolj naravno "dajte mi številko od 1 do 10", to res pomeni "dajte mi številko od 0 do 9." Lahko ste bolj natančni glede izbire številk, tako da Get-Random se obnaša bolj kot ste pričakovali, vendar tega v tem skriptu ne bomo potrebovali.

2. del: Pridobivanje uporabniškega vhoda in začetka dela

Medtem ko skript, ki ustvarja samo eno naključno ime &telefonska številka je super, veliko bolje je, če skript omogoča uporabniku, da navede, koliko imen in amp;številke, ki jih želijo dobiti v eni seriji. Na žalost ne moremo resnično zaupati uporabnikom, da vedno dajejo veljaven vnos. Torej, tu je še malenkost več kot samo $ UserInput = Read-Host .

, medtem ko( ! $ ValidInput){ poskusite{ [int] $ UserInput = Read-Host -Prompt 'Postavke, ki jih želite generirati' $ ValidInput = $ true} ujeti{ Write-Host 'Neveljaven vnos. Vnesite le številko. '-ForegroundColor Red}}

V zgornji izjavi se preverja in negira vrednost $ ValidInput. Dokler je vrednost $ ValidInput napačna ali ne obstaja, bo obdržala zanke skozi svoj skriptni blok.

Izjava poskuša uporabniški vhod, preko Read-Host, in ga poskuša pretvoriti v celoštevilčno vrednost.(To je [int] pred Read-Hostom.) Če je uspešen, bo nastavil vrednost $ ValidInput na resnično, tako da bo lahko zanka časa izhoda.Če ni uspešen, blok ulova objavlja napako in ker $ ValidInput ni nastavljen, se bo zanka za nazaj obrnila in uporabniku znova pozvala.

Ko uporabnik pravilno dodeli številko kot vhod, želimo, da skript naznani, da bo začel dejansko opravljati svoje delo in nato začeti delati.

Write-Host "` n Generiraj $ UserInput imena in telefonske številke. Prosimo, bodite potrjeni.`n "1. . $ UserInput |ForEach-Object{ & lt; # INSERT RANDOM NAME &NUMER GENERATOR HERE # & gt;}

Ne skrbite, ne bomo pustili sami, da bi ugotovili naključno ime &številka generatorske številke. To je le komentar na mestu, ki vam bo pokazal, kje se bo ujemal naslednji del( kjer se bo dejansko opravilo).

Linija Write-Host je precej preprosta. Preprosto reče, koliko imen in telefonskih številk skripta generira, in prosi uporabnika, da je potrpežljiv, medtem ko scenarij opravlja svoje delo. `n na začetku in koncu niza je, da vstavi prazno črto pred in po tem izhodu, samo zato, da bi dal nekaj vidnega ločevanja med vhodno linijo in seznamom imen in amp;številke. Zavedajte se, da gre za hrbtni kljuk( AKA "grob naglas" - ponavadi ključ nad jezičkom, levo od 1), ne pa apostrof ali enojni citat pred vsakim n .

Naslednji del prikazuje drugačen način uporabe zanke ForEach-Object. Običajno, če želite, da se skriptni blok zažene določen čas, nastavite običajno zanko kot za( $ x = 1; $ x -le $ UserInput; $ x ++){ & lt; # INSERT SCRIPTTUKAJ # & gt;}. ForEach-Object nam omogoča, da to poenostavimo tako, da ga hranimo s cepivom in namesto da bi mu povedali, da dejansko naredi kaj s temi celi števili, dajemo samo statični blok skripta, da teče, dokler ne zmanjka cela števila, da bi to naredili.

Del 3: Ustvarjanje naključnega imena

Ustvarjanje imena je najpreprostejši del preostanka tega postopka. Vsebuje le tri korake: pobiranje priimka, izbiranje spola in izbiranje imena. Se spomniš tega vzdevka, ki smo ga naredili za Get-Random?Čas, da začnete uporabljati to.

$ Priimek = Get-Content "$ ScriptFolder \ Surnames.txt" |g $ Moški = g 2 če( $ Moški){ $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" |g} drugo{ $ FirstName = Get-vsebina "$ ScriptFolder \ Females.txt" |g}

V prvi vrstici je naš seznam priimkov, ga vnesemo v naključno izbiranje in dodeljeno izbrano ime dodelimo $ Priimku.

Druga vrstica izbere spol našega človeka. Se spomniš, kako Get-Random začne šteti od nič, in kako nič je napačno, in vse ostalo je resnično? Tako uporabljamo Get-Random 2 ( ali veliko krajši g 2 , zahvaljujoč našemu vzdevku - oboje imata izbiro med ničlo ali enim), da se odloči, ali je naša oseba moška ali ne. Izjava if / else nato naključno izbere ime moškega ali ženskega imena v skladu s tem.

Del 4: Ustvarjanje naključne telefonske številke

Tukaj je res zabaven del. Pred tem smo vam pokazali, kako lahko na več načinov naredite neveljavno ali fiktivno telefonsko številko. Ker ne želimo, da bi vse naše številke iskale preveč podobne, bomo naključno izbrali neveljavno obliko številk vsakič.Naključno izbrane oblike bodo opredeljene z njihovo območno kodo in kodo Exchange, ki se bo skupaj shranila kot $ Prefix.

$ NumberFormat = g 5 stikalo( $ NumberFormat){ 0{ $ Prefix = "($( g 2) $( g 10) $( g 10)) $( g 10) $( g 10) $( g 10)"${ G) ${ g 10) $( g 10)"} 2{ $ Prefix = "($( g 10)) $$( g 10) $( g 10)) $( g 2) $( g 10) $( g 10) "} 3{ $ Prefix ="( $ 10 g $)) $( g 10) 11 "} 4{ $ Prefix ="( $( g 10) $( g 10) $( g 10)) 555 "}}

Prva vrstica je neposredna generacija naključnih števil,sledili bomo telefonski številki. Nato izjava stikala sprejme to naključno izbiro in ustrezno ustvari $ Prefix. Se spomniš tega seznama neveljavnih tipov telefonskih številk? Vrednosti $ NumberFormat 0-3 ustrezajo prvim štirim na tem seznamu. Vrednost 4 lahko ustvari eno od zadnjih dveh, saj oba uporabljajo "555" Exchange kodo.

Tukaj lahko vidite, da uporabljamo še en trik z dvojnimi narekovaji. Dvojni nareki ne omogočajo preprosto tolmačenja spremenljivk, preden se izpisuje niz - omogočajo tudi obdelavo scenarijskih blokov.Če želite to narediti, zavijte skriptni blok, kot je ta: "$( & lt; #SCRIPT HERE # & gt;)" .Torej, tisto, kar imate zgoraj, je veliko posameznih naključnih števil, pri čemer so nekateri od njih bodisi omejeni v svojem obsegu bodisi statično v skladu s pravili, ki jih moramo slediti. Vsak niz ima tudi oklepaj in razmik, kot ste običajno pričakovali, da boste videli v območju za kodo in kode Exchange.

Zadnja stvar, ki jo moramo storiti, preden smo pripravljeni na izdajanje našega imena &telefonska številka je generiranje podružničnega ID-ja, ki bo shranjen kot $ Suffix.

stikalo( $ NumberFormat){ {$ _ -lt 4}{ $ Suffix = "$( g 10) $( g 10) $( g 10) $( g 10)"} 4{ switch( $ Prefix){ ($ 10) $( g 10) "}}}}

Zaradi posebnih pravil za 555 številk ne moremo samoustvarite štiri naključne števke za konec vsake telefonske številke, ki jo namerava narediti. Torej, prvo stikalo preveri, ali se ukvarjamo s številko 555.Če ne, generira štiri naključne številke.Če je številka 555, drugo stikalo preveri območno kodo 800.Če se to ujema, obstaja samo en veljaven $ Suffix, ki ga lahko uporabimo. V nasprotnem primeru je dovoljeno izbrati kaj med 0100-0199.

Upoštevajte, da bi lahko bil ta blok napisan na nekaj različnih načinov, namesto da bi bil. Obe stavki preklopov bi lahko nadomestili z if / else stavki, saj vsak od njiju upravlja le z dvema možnostima. Tudi namesto posebej izgovarjanja "4" kot opcije za prvi izjavo stikala, bi lahko "privzeto" uporabili podobno, kot je bilo storjeno v drugem, ker je bila edina možnost, ki je ostala. Izbira med if / else ali preklapljanjem ali kje uporabiti privzeto ključno besedo namesto določenih vrednosti se pogosto sklicuje na vprašanje osebne nastavitve. Dokler deluje, uporabite vse, kar vam najbolj ustreza.

Zdaj je čas za izhod.

Write-Output "$ FirstName $ Priimek $ Prefix- $ Suffix"}

Ta je precej preprosta, kot jo dobi v skripti. Samo izpisuje ime in priimek, ločeno s presledki, nato pa še en prostor pred telefonsko številko. Tukaj je dodana tudi standardna pomišljaj med kodo Exchange in Subscriber ID.

Ta zaključni nosilec na dnu je konec zanke ForEach-Object iz prejšnjega - izpustite to, če ste ga že dobili.

5. del: Čiščenje in zagon skripte

Ko se vse delo opravi, dober scenarij ve, kako se čisti po sebi. Spet odstranitev spremenljivke spodaj ni res potrebna, če boste šele zagnali skript iz konzole, vendar jo boste želeli, če boste kdaj načrtovali zagon v ISE.

Ali je odstranjen element: \ g Odstrani spremenljivko ScriptFolder, RequiredFiles, Priimek, Moški, FirstName, NumberFormat, Prefix, Suffix, ValidInput, UserInput

Ko končate vse, shranite skript z razširitvijo ».ps1«v isti mapi kot datoteke z imeni. Prepričajte se, da je vaša ExecutionPolicy nastavljena tako, da lahko skript zažene in mu daste vrtinčasto.

Tukaj je skripta skripta v akciji:

Datoteko ZIP, ki vsebuje ta skript PowerShell, in besedilne datoteke s seznami imen, lahko prenesete tudi s spodnje povezave.

Naključno ime &Generator telefonskih številk za PowerShell