Kun tarvitset testausta tai esittelyä varten tarvittavan tietojoukon, ja että asetuksessa on oltava henkilökohtaisesti identifioitavissa oleva tieto (PII), et yleensä halua käyttää todellista tietoa, joka edustaa todellisia ihmisiä. Tässä käymme läpi, kuinka voit käyttää PowerShell-tietokantaa tuottamaan luettelon satunnaisista nimistä ja puhelinnumeroista juuri tällaiseen tilanteeseen.
Ennen kuin aloitat, on joitain työkaluja ja tietoja, joita sinun pitäisi olla:
Tämä skripti on kehitetty PowerShell 4.0: n avulla, ja sitä on myös testattu yhteensopivuuden kanssa PowerShell 2.0: n kanssa. PowerShell 2.0 tai uudempi on asennettu Windowsiin Windows 7: n jälkeen. Se on saatavana myös Windows XP ja Vista osana Windows Management Framework (WMF) -järjestelmää. Joitakin yksityiskohtia ja ladattavia linkkejä ovat alla.
Tarvitset joitain nimiluetteloja, jotka syötetään satunnaisgeneraattoriin. Hyvä lähde a erä nimistä ja niiden suosioon liittyvistä tiedoista (vaikka sitä ei käytetä tässä käsikirjoituksessa), on Yhdysvaltojen väestörekisteri. Alla oleviin linkkeihin saatavilla olevat luettelot ovat hyvin suuria, joten voit halutessasi pienentää niitä hieman, jos aiot tuottaa paljon nimiä ja numeroita kerralla. Kokeilujärjestelmässämme kustakin nimestä / numeroparista kesti noin 1,5 sekuntia tuottamalla täydellisiä luetteloita, mutta mittarilukema vaihtelee omien järjestelmätietojen mukaan.
Riippumatta siitä lähteestä, jota käytät, sinun on luotava kolme tekstitiedostoa, joita skripti voi käyttää nimistöjen valintaan. Jokaisen tiedoston pitäisi sisältää vain nimiä ja vain yksi nimi riviä kohden. Nämä on tallennettava samaan kansioon kuin PowerShell-skripti.
Surnames.txt pitäisi sisältää sukunimet, joita haluat komentosarjasta valita. Esimerkki:
Smith Johnson Williams Jones Brown
Males.txt pitäisi sisältää miesten etunimet, joista haluat komentosarjasta valita. Esimerkki:
James John Robert Michael William
Females.txt pitäisi sisältää naispuoliset etunimet, joista haluat komentosarjasta valita. Esimerkki:
Mary Patricia Linda Barbara Elizabeth
Jos haluat olla varma, että puhelinnumerosi eivät vastaa kenenkään todellista puhelinnumeroa, helpoin tapa on käyttää tunnettua "555" -vaihtoa. Mutta jos aiot näyttää joukon puhelinnumeroita, 555 alkaa näyttää melko yksitoikkoiselta todella nopeasti. Jotta asiat saataisiin mielenkiintoisemmiksi, luodaan muita puhelinnumeroita, jotka rikkovat Pohjois-Amerikan numerointisuunnitelmaa (NANP). Alla on muutamia otoksia virheellisiä puhelinnumeroita, jotka edustavat jokaista tämän koodin luomaa numeroaluetta:
Huomaa, että edellä mainitut säännöt voivat muuttua, ja ne voivat vaihdella tuomioistuimen toimesta. Sinun pitäisi tehdä oma tutkimus tarkistaa nykyiset säännöt, jotka ovat sovellettavissa paikallistoimintaan, jolle tuotavat puhelinnumeroita.
Joitakin melko yleisiä komentoja, joita tullaan käyttämään läpi tämän käsikirjoituksen, joten sinun pitäisi saada perusajatus siitä, mitä nämä tarkoittavat ennen kuin sukeltamme kirjoittamiseen.
Skriptissä on muita komentoja, mutta selitämme niitä, kun menemme.
Nyt on aika saada kätemme likaiseksi.
Jos haluat, että käsikirjoituksesi alkaa käydä puhtaasta konsolista, tässä on ensimmäinen haluamasi rivi.
Clear-Host
Nyt kun meillä on puhdas näyttö, seuraava asia, jonka haluamme tehdä, on oltava käsikirjoitustarkistus, jotta kaikki tarvitsevat ovat paikallaan. Tätä varten meidän on aloitettava kertomalla, mistä etsiä ja mitä etsiä.
$ ScriptFolder = Split-Path $ MyInvocation.MyCommand.Definition -Parent $ RequiredFiles = ('Males.txt', 'Females.txt', 'Surnames.txt')
Ensimmäinen rivi on erittäin hyödyllinen kaikille komentosarjoille. Se määrittää muuttujan, joka osoittaa komentosarjan sisältävän kansion. Tämä on välttämätöntä, jos käsikirjassasi tarvitaan muita tiedostoja, jotka sijaitsevat samassa hakemistossa kuin itse (tai tiedossa oleva suhteellinen polku kyseisestä hakemistosta), koska muuten kohdatte virheitä jos ja kun yrität suorittaa komentosarjan ollessasi toisessa työhakemisto.
Toinen rivi luo joukon tiedostonimiä, jotka vaaditaan komentosarjan suorittamiseksi oikein. Käytämme tätä yhdessä $ ScriptFolder -muuttujan kanssa seuraavassa kappaleessa, jossa tarkistamme, että tiedostot ovat läsnä.
$ RequiredFiles | ForEach-Object if (! (Test-Path "$ ScriptFolder \ $ _")) Kirjoita-isäntä "$ _ ei löytynyt." -ForegroundColor Red $ MissingFiles ++
Tämä komentojoukko lähettää $ RequiredFiles-taulukon ForEach-objekti -lohkoon. Sellaisen komentorivin sisällä if-lausuma käyttää Test-Path-ohjelmaa nähdäksesi, etsitäänkö tiedosto, johon se kuuluu. Test-Path on yksinkertainen komento, joka antaa tiedostopolulle annetun perustieton tai väärä vastauksen kertoakseen, onko polku viittaa olemassa olevaan. Huutomerkki on a ei operaattori, joka kääntää Test-Pathin vastauksen ennen kuin se välittää sen if-lauseen. Joten jos Test-Path palauttaa väärennetty (toisin sanoen etsimäsi tiedosto ei ole olemassa), se muuttuu oikeaksi, jotta if-lauseke suorittaisi sen script-lohkon.
Toinen asia, jota on huomattava tässä, jota käytetään usein tässä käsikirjoituksessa, on kaksinkertaisen lainausmerkinnän käyttäminen yksittäisten lainausten sijaan. Kun laitat jotain yksittäisiin lainauksiin, PowerShell käsittelee sitä staattisena merkkijonoina. Mikä tahansa yksittäisissä lainauksissa, siirretään täsmälleen samalla tavalla. Double-quotes kertoo, että PowerShell kääntää muuttujat ja jotkut muut erikoismerkit merkkijonoon ennen sen kulkua. Tässä kaksinkertaiset lainausmerkit tarkoittavat sitä, että he eivät käy Test-Path '$ ScriptFolder \ $ _' me todella teemme jotain enemmän Test-Polku 'C: \ Scripts \ Surnames.txt' (olettaen, että käsikirjasi on C: \ Scriptsissa ja ForEach-Object toimii parhaillaan 'Surnames.txt').
Jokaisesta tiedostosta ei löydy, Kirjoita-isäntä lähettää virheilmoituksen punaisella ja kertoo, mikä tiedosto puuttuu. Sitten se kasvattaa $ MissingFiles -muuttujaa, jota käytetään seuraavassa kappaleessa, virheeseen ja lopettamaan, jos tiedostoja puuttuu.
jos ($ MissingFiles) Kirjoita-isäntä "Ei löydy $ MissingFiles-lähdetiedostoa. -ForegroundColor Punainen Remove-Variable ScriptFolder, RequiredFiles, MissingFiles Poistu
Tässä on toinen siisti temppu, jota voit tehdä, jos lausunnot. Useimmissa oppaissa näet, jos lausunnot kertovat käytät operaattoria tarkistaaksesi yhteensopivuustilan. Voimme esimerkiksi käyttää tätä jos ($ MissingFiles -gt 0) onko $ MissingFiles suurempi kuin nolla. Jos käytät jo komentoja, jotka palauttavat boolean arvon (kuten edellisessä lohkossa, jossa käytimme Test-Polkua), jotka eivät ole välttämättömiä. Voit myös tehdä sen ilman tällaisia tapauksia, kun testaat vain, onko numero nollaton. Kaikki ei-nollanumerot (positiiviset tai negatiiviset) käsitellään oikeina, kun taas nolla (tai, kuten täälläkin, ei-olemassa olevaa muuttujaa) käsitellään vääriksi.
Jos $ MissingFiles on olemassa, ja se on ei-nolla, Write-Host lähettää viestin, jossa kerrotaan, kuinka monta tiedostoa puuttuu ja että komentotiedosto keskeytyy. Tällöin Poista-muuttuja puhdistaa kaikki luomasi muuttujat ja Exit lopettaa komentosarjan. Normaalissa PowerShell-konsolissa Poista-muuttujaa ei todellisuudessa tarvita tähän tarkoitukseen, koska komentosarjojen määrittämät muuttujat hylätään normaalisti, kun komentosarja poistuu. PowerShell ISE kuitenkin käyttäytyy hieman eri tavalla, joten voit halutessasi pitää tämän sisään, jos suunnittelet komentosarjan käynnistystä sieltä.
Jos kaikki asiat ovat kunnossa, komentosarja jatkuu. Yksi valmistautuminen on alias, että olemme todella iloisia myöhemmin.
Uusi-Alias g Get-Satunnainen
Aliaseja käytetään komennoiden vaihtoehtoisten nimien luomiseen. Ne voivat auttaa meitä tutustumaan uuteen käyttöliittymään (esim. PowerShellillä on sisäänrakennetut aliakset, kuten dir -> Get-ChildItem ja kissa -> Get-Content) tai tehdä lyhyitä viittauksia yleisesti käytetyille komennoille. Täällä teemme a erittäin Lyhyen käden viitenumero Get-Random komentoa, jota aiotaan käyttää paljon myöhemmin.
Get-Satunnainen melko paljon tekee mitä sen nimi merkitsee. Koska taulukko (kuten nimiluettelo) syötteeksi, se valitsee satunnaisen kohteen taulukosta ja pureskelee sen. Sitä voidaan myös käyttää satunnaislukujen tuottamiseen.Muistettavaa Get-Randomista ja numeroista on kuitenkin se, että kuten monet muut tietokonetoiminnot, se alkaa laskea nollasta. Joten sen sijasta Get-Satunnaiset 10 eli luonnollisempi "anna minulle numero 1-10", se tarkoittaa todella "anna minulle numero 0 ... 9." Voit olla tarkempi numeroiden valinta, niin että Get-Random käyttäytyy enemmän kuin luonnollisesti odottaa, mutta emme tarvitse sitä tässä kirjoitusohjelmassa.
Vaikka komentosarja, joka tuottaa vain yhden satunnaisen nimen ja puhelinnumeron, on paljon parempi, jos komentosarjan avulla käyttäjä voi määrittää, kuinka monta nimeä ja numeroa he haluavat saada yhdessä erässä. Valitettavasti emme voi luottaa siihen, että käyttäjät voivat aina antaa kelvollisen syötteen. Joten, tässä on vähän enemmän kuin vain $ UserInput = Read-Host.
kun taas (! $ ValidInput) try [int] $ UserInput = Read-Host -Prompt 'Luodut kohteet' $ ValidInput = $ true catch Write-Host Virheellinen syöttö. Anna vain numero. " -Reikunväri punainen
Kun taas yllä oleva lausuma tarkistaa ja mittaa ValidInputin arvon. Niin kauan kuin $ ValidInput on väärä tai sitä ei ole, se jatkaa silmukoitumista komentojononsa läpi.
Kokeiluversio ottaa käyttäjätulon Read-Hostin kautta ja yrittää muuttaa sen kokonaislukuarvoiksi. (Se on [Int] ennen Read-Hostia.) Jos se on onnistunut, se asettaa $ ValidInput: n oikeaksi niin, että taas silmukka voi poistua. Jos ei onnistunut, catch block lähettää virhettä ja koska $ ValidInput ei ole asetettu, kun taas silmukka palaa takaisin ja kehottaa käyttäjää uudelleen.
Kun käyttäjä on oikein antanut numeron syötteeksi, haluamme, että komentosarja ilmoittaa olevansa alkamassa itse tekemään työnsä ja sitten tekemään sen.
Write-Host "" nGenerating $ UserInput nimet ja puhelinnumerot. Ole kärsivällinen. "1 ... $ UserInput | ForEach-Object
Älä huolestu, emme jätä sinua itse selvittämään satunnaisen nimen ja numeron generaattorikoodin. Se on vain paikkamerkkikommentti, jossa näytetään, missä seuraavassa osassa (missä todellinen työ tehdään) on sovitettavissa.
Write-Host-rivi on melko suoraviivaista. Se kertoo yksinkertaisesti, kuinka monta nimeä ja puhelinnumeroita käsittelevä kirjoitusohjelma tuottaa ja pyytää käyttäjää kärsivällisyydestä, kun käsikirjoitus toimii.'nmerkkijonon alussa ja lopussa on sijoitettava tyhjä rivi ennen ja jälkeen kyseisen ulostulon, jotta se antaisi jonkin verran visuaalista eroa syöttölinjan ja nimien ja numeroiden välillä. Huomaa, että tämä on ristikuvake (AKA "vakava aksentti" - tavallisesti yläpuolella oleva välilehti, vasemmalla puolella 1) eikä kummallakin n.
Seuraavassa osassa näkyy erilainen tapa käyttää ForEach-objektiosilmukkaa. Tyypillisesti, kun haluat, että komentotiedostoa käytetään tietty määrä kertoja, määrität säännöllisen silmukan kaltaisen ($ x = 1; $ x -le $ UserInput; $ x ++) .ForEach-Objectin avulla voimme yksinkertaistaa tätä syöttämällä sen kokonaislukujen joukosta ja sen sijaan, että kerromme sen suorittavan itse mitään näiden kokonaislukujen kanssa, annamme sille vain staattisen komentosarjan, kunnes se loppuu kokonaislukuina.
Nimen luominen on yksinkertaisin bitti tämän prosessin loppuosasta. Se koostuu kolmesta vaiheesta: sukunimen ottamisesta, sukupuolen valitsemisesta ja etunimen valitsemisesta. Muista, että ali-merkki, jonka teimme Get-Randomille jonkin aikaa takaisin? Aika alkaa käyttää sitä.
$ Sukunimi = Get-Content "$ ScriptFolder \ Surnames.txt" | g $ Mies = g 2 if ($ mies) $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" | g else $ FirstName = Hae-sisältö "$ ScriptFolder \ Females.txt" | g
Ensimmäinen rivi ottaa sukunimeä koskevan luettelon, syöttää sen satunnaisvalitsimeen ja antaa valitun nimen $ Sukunimi.
Toinen rivi valitsee henkilön sukupuolemme. Muista, kuinka Get-Random alkaa laskea nollasta ja kuinka nolla on väärä ja kaikki muu on totta? Näin käytämme Get-Random 2 (tai paljon lyhyempi g 2 kiitos aliaksemme - molemmat johtavat valintaan nollan tai yhden välillä) päättää, onko meidän henkilö mies vai ei. If / else-lauseen jälkeen satunnaisesti valitsee mies- tai naispuolisen etunimen vastaavasti.
Tässä on todella hauska osa. Aikaisemmin näytimme sinulle, miten on useita tapoja, joilla voit tehdä virheellisen tai fiktiivisen puhelinnumeron. Koska emme halua, että kaikki numerot näyttävät liian samanlaisilta toisiinsa, valitamme satunnaisesti virheellisen numeromuodon joka kerta. Satunnaisesti valitut tiedostomuodot määritellään niiden aluekoodilla ja Exchange-koodilla, jotka tallennetaan yhteisesti $ Prefixiksi.
(G 10) $ (g 10) $ (g 10) $ (g 10) "($ 10)" $ NumberFormat = g 5-kytkin ($ NumberFormat) 0 $ Prefix = $ $ Prefix = "($ (g 10)) $ (g 10) $ (g 10) $ (g 10) (g 10)) $ (g 10)) $ (g 10) $ (g 10)) $ (g 10)) $ (g 10) $ (g 10) $ (g 10)) 555 " $ $ Prefix =
Ensimmäinen rivi on suoraviivainen satunnaisluku, jonka avulla voit valita, mihin muotoon seuraamme puhelinnumeroa. Sitten kytkinlausunto ottaa satunnaisen valinnan ja luo $ etuliitteen vastaavasti. Muista, että luettelo virheellisistä puhelinnumeroista on? $ NumberFormat-arvot 0-3 vastaavat ensimmäisiä neljää luettelossa. Arvo 4 voi luoda yhden viimeisestä kahdesta, koska molemmat käyttävät "555" -vaihtoehtoa.
Täällä voit myös nähdä, että käytämme jotain muuta kakkospyyntöä.Kaksoiskutsuilla ei vain anna tulkita muuttujia ennen merkkijonon tuottamista - ne myös antavat sinun käsitellä käsikirjoituslohkoja. Voit tehdä tämän seuraavasti: “$()”. Joten, mitä olet edellä, on paljon yksilöllisesti satunnaistettuja numeroita, jotkut heistä joko rajoitettu niiden alueelle tai asettaa staattisesti mukaan sääntöjä meidän on noudatettava. Jokaisella merkkijonolla on myös sulkeja ja välilyöntejä, kuten normaalisti oletat näkyvän aluekoodi ja Exchange-koodin parissa.
Viimeinen asia, jonka on tehtävä ennen kuin olemme valmiita tuottamaan nimi ja puhelinnumeromme, on luoda tilaajan tunnus, joka tallennetaan $ suffiksiksi.
($ NumberFormat) $ _ -lt 4 $ Suffix = "$ (g 10) $ (g 10) $ (g 10) $ (g 10)" 4 800) 555 '$ Suffix =' 0199 ' oletusarvo $ Suffix = "01 $ (g 10) $ (g 10)"
555-numeroiden erityissääntöjen vuoksi emme voi luoda vain neljää satunnaislukua kunkin puhelinnumeron loppuun, jonka skripti tulee tekemään. Joten ensimmäinen kytkin tarkistaa, onko meillä 555-numero. Jos ei, se luo neljä satunnaislukua. Jos se on 555-numero, toinen kytkin tarkistaa 800-aluekoodin. Jos se sopii yhteen, voimme käyttää vain yhtä voimassa olevaa $ Suffixia. Muussa tapauksessa se voi valita minkä tahansa välillä 0100-0199.
Huomaa, että tämä lohko olisi voitu kirjoittaa muutamia tapoja sen sijaan, että se olisi. Molemmat kytkin-lausunnot olisivat voineet korvata if / else-lauselmilla, koska ne käsittelevät vain kahta valintaa. Lisäksi, sen sijaan, että kutsuttiin "4" ensimmäisen vaihtoehdon vaihtoehtona, "oletusarvoa" olisi voitu käyttää samanlaisena kuin se tapahtui toisessa vaiheessa, koska se oli ainoa vaihtoehto jäljellä. Jos valitset vaihtoehdon if / else vs. switch tai jos haluat käyttää oletus avainsanan tiettyjen arvojen sijaan, se usein tulee henkilökohtaiseen mieltymykseen. Niin kauan kuin se toimii, käytä mitä tahansa mukavinta.
Nyt on aika lähteä.
Write-Output "$ Etunimi $ Sukunimi $ Prefix- $ suffix"
Tämä on melko yksinkertainen kuin se saa komentosarjassa. Se tuottaa vain etu- ja sukunimen, jotka on erotettu välilyönnillä, sitten toinen tila ennen puhelinnumeroa. Tällöin myös Exchange-koodin ja tilaaja-ID: n välinen tavallinen viiva lisätään.
Kyseinen sulkeutumisluku alareunassa on ForEach-objektiivin silmukan loppu aiemmasta - älä jätä tätä, jos olet jo saanut sen.
Kun kaikki työ on tehty, hyvä käsikirjoitus osaa puhdistaa itsensä. Jälleen muuttuvaa poistoa ei tarvita, jos vain ajetaan käsikirjoitus konsolista, mutta haluat sen, jos aiot suunnitella sitä ISE: ssä.
Poista-kohde alias: \ g Poista-muuttuja-komentotiedosto, vaaditut tiedostot, sukunimi, mies, etunimi, numeroformaatti, etuliite, suffix, ValidInput, UserInput
Kun olet saanut kaiken, tallenna skripti ".ps1" -laajennuksella samaan kansioon kuin nimitiedostot. Varmista, että ExecutionPolicy on asetettu niin, että komentosarja toimii ja antaa sille pyörteen.
Tässä on kuvakaappaus komentosarjasta toiminnassa:
Voit myös ladata tämän PowerShell-komentosarjan sisältävän ZIP-tiedoston ja tekstitiedostot nimiluettelon avulla alla olevasta linkistä.
PowerShellin satunnainen nimi ja puhelinnumeroiden generaattori