10Sep

Véletlen nevek létrehozása &Telefonszámok a PowerShell segítségével

click fraud protection

Ha tesztelésre vagy bemutatásra van szükség egy adatkészlethez, és a készletnek személyazonosításra alkalmas információkat( PII) kell tartalmaznia, akkor általában nem szeretné használni a tényleges embereket ábrázoló valós adatokat. Itt meglátogatjuk, hogyan használhatja a PowerShell-et, hogy létrehozzon egy véletlenszerű neveket és telefonszámokat egy ilyen alkalomra.

Amire szükséged van

Mielőtt elkezdené az alkalmazást, rendelkezésére áll néhány eszköz és információ:

PowerShell

Ez a szkript a PowerShell 4.0 segítségével készült, és tesztelt is a PowerShell 2.0 kompatibilitással. A PowerShell 2.0 vagy újabb verzió Windows 7 óta telepítve van a Windows rendszerbe. Windows XP és Vista is elérhető a Windows Management Framework( WMF) részeként. További részletek és letöltési linkek találhatók. Az

  • PowerShell 2.0 Windows 7 operációs rendszerrel érkezik. A Windows XP SP3 és Vista( SP1 vagy újabb) felhasználók letölthetik a megfelelő Microsoft WMF verziót a KB968929-es verzióban. Nem támogatott az XP SP2 vagy az alatt, vagy Vista nélkül SP1.
  • instagram viewer
  • A PowerShell 4.0 Windows 8.1 rendszerrel van ellátva. A Windows 7 SP1 felhasználók frissíthetik a frissítést a Microsoft letöltőközpontjából származó WMF frissítés részeként. Nem érhető el XP vagy Vista.

Nevek

Szükséged lesz néhány névlistára, amelyek betáplálhatók a véletlen generátorba. Az sok név nagyszerű forrása, valamint a népszerűségükre vonatkozó információ( bár ez nem használható erre a szkriptre) az Egyesült Államok Népszámlálási Hivatala. Az alábbi linkeken elérhető listák nagyon nagyok, ezért kicsit lecsökkentheted őket, ha egyidejűleg sok nevet és számot generálsz. A tesztrendszerünkön minden név / számpár kb. 1,5 másodpercet vett igénybe a teljes listák használatával, de a futásteljesítmény függ a saját rendszerspecifikációktól.

  • Vezetéknevek
  • Férfi elnevezések
  • Női elnevezések

A használt forrástól függetlenül létre kell hoznia három szövegfájlt, amelyeket a szkript használható névként való használatra. Minden fájlnak csak neveket kell tartalmaznia, és soronként csak egy nevet kell megadnia. Ezeket ugyanabban a mappában kell tárolni, mint a PowerShell parancsfájl.

Surnames.txt Az -nek tartalmaznia kell a szkript által választott vezetékneveket. Példa:

Smith Johnson Williams Jones Brown

A males.txt tartalmazza a férfi első nevét, ahová a szkriptet ki szeretné választani. Példa:

James John Robert Michael William

Az females.txt tartalmazza a női előneveket, ahová a szkriptet ki szeretné választani. Példa:

Mary Patricia Linda Barbara Elizabeth

A telefonszámok szabályai

Ha biztos akar lenni abban, hogy a telefonszámai nem egyeznek valaki valódi telefonszámával, a legegyszerűbb módja a jól ismert "555" Exchange kód használata. De ha sok telefonszámmal fogsz megjeleníteni egy adathalmazt, akkor az 555 eléggé monotonnak tűnik. A dolgok érdekesebbé tétele érdekében további telefonszámokat generálunk, amelyek sértik az észak-amerikai számozási tervet( NANP).Az alábbiakban néhány minta érvénytelen telefonszámot tartalmaz, amelyek a szkript által generált számok mindegyikét jelölik:

  • ( 157) 836-8167
    Ez a szám érvénytelen, mivel a területi kódok nem kezdődhetnek 1 vagy 0.
  • ( 298) 731-6185
    Ez a szám érvénytelen, mert a NANP nem adja meg a területi kódokat a 9-es számmal a második számjegyként.
  • ( 678) 035-7598
    Ez a szám érvénytelen, mert az Exchange kódok nem kezdődhetnek 1 vagy 0.
  • ( 752) 811-1375
    Ez a szám érvénytelen, mert az Exchange kódok nem fejezhetnek be két 1-tel.
  • ( 265) 555-0128
    Ez a szám érvénytelen, mert az Exchange kód 555, és az Előfizetői azonosító a fiktív számok számára fenntartott tartományon belül van.
  • ( 800) 555-0199
    Ez a szám az egyetlen 800 szám, 555 Exchange kóddal, amely fiktív számra van fenntartva.

Ne feledje, hogy a fenti szabályok változhatnak, és joghatóságonként eltérőek lehetnek. Meg kell tennie a saját kutatást, hogy ellenőrizze az aktuális szabályokat, amelyek az adott helyszínre vonatkoznak, amelyhez telefonszámot generál.

Közös parancsok

Van néhány meglehetősen gyakori parancs, amelyet használni fognak ebben a szkriptben, ezért alapos elképzelést kell kapnunk arról, hogy ezek mit jelentenek mielőtt merülnénk a valóban írásba.

  • ForEach-Object Az egy objektum tömbjét vagy listáját veszi fel, és mindegyikre végrehajtja a megadott műveletet. A ForEach-Object parancsfájlblokkon belül a $ _ változó az aktuálisan feldolgozott elemre utal.
  • ha. .. máshol az állítások lehetővé teszik, hogy csak bizonyos feltételek teljesülése esetén végezzen műveletet, és( opcionálisan) adja meg, hogy mit kell tenni, ha az adott feltétel nem teljesül.
  • kapcsoló Az utasítások olyanok, mintha több választási utasítást kapnának. A kapcsoló ellenőrizni fogja az objektumot több körülmény között, és futtathatja a szkriptblokkokat, amelyek az objektumokkal megegyeznek. Opcionálisan megadhat egy alapértelmezett blokkot is, amely csak akkor fut, ha nincs más feltétel. A kapcsoló kijelenti a $ _ változót is, hogy az aktuálisan feldolgozandó elemre hivatkozzon.
  • , míg az utasítások lehetővé teszik, hogy folyamatosan ismételje meg a szkriptblokkot, amíg egy bizonyos feltétel teljesül. Ha valami történik, ami azt eredményezi, hogy az állapot többé nem lesz igaz, amikor a parancsfájl befejeződött, a hurok kilép.
  • próbálja. .. fogás utasítások segítenek a hibakezelésben. Ha valami meghiúsul a próbálkozáshoz megadott parancsfájllal, akkor a fogási blokk fut.
  • A Get-Content azt teszi, amit az ónról mond. Megkapja a megadott objektum tartalmát - általában egy fájlt. Ezt felhasználhatja egy szövegfájl tartalmának megjelenítéséhez a konzolon, vagy - mint ebben a szkriptben - adja át a csővezeték tartalmát más parancsokkal együtt.
  • Write-Host Az betölti a konzolt. Ezzel üzeneteket jeleníthet meg a felhasználónak, és nem szerepel a parancsfájl kimenetében, ha a kimenet átirányításra kerül.
  • Write-Output Az valójában kimenetet generál. Ez általában a konzolba kerül, de más parancsok is átirányíthatók.

A parancsfájlban más parancs is létezik, de mi elmagyarázzuk ezeket.

A Script készítése

Most itt az ideje, hogy piszkos kezünket kapjuk.

1. rész: Elkészületek

Ha szereted a szkriptedet, hogy elinduljon egy tiszta konzolról, akkor itt az első sor, amelyet rajta akarsz.

Clear-Host

Most, hogy van egy tiszta képernyőn, a következő dolog, amit akarunk, hogy a script ellenőrizze, hogy minden amire szüksége van a helyén. Ehhez meg kell kezdeni, hogy megmondjuk, hol kell keresni, és mit keres.

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

Az első sor nagyon hasznos minden szkript számára. Meghatároz egy változót, amely a szkriptet tartalmazó mappára mutat. Ez alapvető fontosságú, ha a szkripthez olyan más fájlok szükségesek, amelyek ugyanabban a könyvtárban találhatók, mint maga( vagy egy ismert relatív útvonal ebből a könyvtárból), mert egyébként hibákat tapasztal, ha és amikor megpróbálja futtatni a szkriptet, amíg másikmunkakönyvtár.

A második sor olyan fájlneveket hoz létre, amelyek szükségesek ahhoz, hogy a szkript megfelelően működjön. Ezt a $ ScriptFolder változóval együtt használjuk a következő részben, ahol ellenőrizzük, hogy ezek a fájlok jelen vannak-e.

$ RequiredFiles |ForEach-Object{ ha( !( Testpálya "$ ScriptFolder \ $ _")){ Az írás-fogadó "$ _ nem található".-ForegroundColor Red $ MissingFiles ++}}

Ez a parancsfájl darabja elküldi a $ RequiredFiles tömböt ForEach-Object blokkra. Ebben a szkriptblokkban az if utasítás használja a Test-ösvényt, hogy megnézze, hogy a keresett fájl hol található.A Test-Path egy egyszerű parancs, amely egy fájl elérési útján megad egy alapvető igaz vagy hamis választ, hogy elmondja nekünk, hogy az elérési út valami létezőt jelez-e. A felkiáltójel egy és nem operátor, amely megfordítja a Test-Path válaszát, mielőtt átadná az if utasításnak. Tehát, ha a Test-Path értéke hamis( azaz a keresett fájl nem létezik), akkor az lesz igaz, hogy az if utasítás végrehajtsa a parancsfájl blokkot.

Egy másik megjegyzés itt, amelyet gyakran használnak ebben a szkriptben, a kettős idézőjelek használata az egyetlen idézetek helyett. Ha valamit idézőjelekbe teszel, a PowerShell statikus karakterláncként kezeli. Bármi is van az egyetlen idézőjelben, pontosan ugyanolyan lesz. A kettős idézőjelek azt mondják a PowerShellnek, hogy lefordítja a változókat és néhány más speciális elemet a stringen belül, mielőtt átmegy. Itt a kettős idézőjelek azt jelentik, hogy az Test-Path '$ ScriptFolder \ $ _' futtatása helyett valami többet fogunk csinálni Test-Path 'C: \ Scripts \ Surnames.txt' a parancsfájl a C: \ Scripts fájlban van, a ForEach-Object pedig jelenleg a 'Surnames.txt' fájlban dolgozik.

Minden egyes nem talált fájl esetében a Write-Host hibaüzenetet küld pirosan, hogy elmondja, melyik fájl hiányzik. Ezután megnöveli a $ MissingFiles változót, amelyet a következő munkanapon fogja használni, hiba esetén és a hiányzó fájl hiányában.

ha( $ MissingFiles){ Write-Host "Nem sikerült megtalálni a $ MissingFiles forrásfájlokat.-ForegroundColor Red Remove-Változó ScriptFolder, RequiredFiles, MissingFiles Kilépés}

Itt van egy másik tisztán trükk, amit megtehetsz, ha kimutatásokat. A legtöbb útmutatást láthatja, ha a nyilatkozatok azt mondják, hogy egy szolgáltatót használ, hogy ellenőrizze a megfelelő feltételeket. Például itt használhatjuk az -t, ha( $ MissingFiles -gt 0) megnézzük, hogy a $ MissingFiles nagyobb-e mint a nulla. Ha azonban olyan parancsokat használsz, amelyek egy logikai értéket adnak vissza( mint az előző blokkban, ahol a tesztpályát használtuk), akkor ez nem szükséges. Ezekben az esetekben is megteheti, ha csak tesztel, hogy egy szám nem nulla. Minden nem nulla számot( pozitív vagy negatív) kezelnek igaznak, míg a nulla( vagy ahogyan ez történik, egy nem létező változót) hamisnak kell tekinteni.

Ha $ MissingFiles létezik, és nem nulla, akkor az író-fogadó üzenetet küld arról, hogy hány fájl hiányzik, és a parancsfájl megszakad. Ezután az Eltávolítás-Változó törli az összes létrehozott változót, és a Kilépés kilép a szkriptből. A rendszeres PowerShell konzolon a Remove-Variable nem feltétlenül szükséges erre a célra, mivel a szkriptek által beállított változókat általában elvetik, amikor a parancsfájl kilép. Azonban a PowerShell ISE viselkedik egy kicsit másképp, így érdemes ezt megtartani, ha tervezi a parancsfájl futtatását.

Ha minden rendben van, a szkript folytatódik. Még egy felkészülés az álnév, amit nagyon örülni fogunk később.

Új-Alias ​​g Get-Random

Az álnevek alternatív nevek létrehozására szolgálnak a parancsok számára. Ezek hasznosak lehetnek az új kezelőfelület megismeréséhez( pl. A PowerShell beépített álnevek, mint az dir -> Get-ChildItem és cat - & gt; Get-Content ) vagy rövid hivatkozásoka gyakran használt parancsokhoz. Itt készítünk egy nagyon rövid hivatkozást az Get-Random parancsra, amelyet később használunk.

A Get-Random elég sok mindent tesz, amit a neve is jelez. Mivel egy tömb( mint a névjegyek listája) bemenetként van megadva, véletlenszerű elemet választ ki a tömbből és kiüríti. Használható véletlen számok létrehozására is. A Get-Random és a számok megjegyzése azonban az, hogy, mint sok más számítógépes művelet, a számlálás nulláról indul. Tehát ahelyett, hogy Get-Random 10 helyett természetesbb lenne "adj egy számot 1-től 10-ig", ez tényleg azt jelenti, hogy "adj egy számot 0-tól 9-ig." Pontosabb lehet a számok kiválasztására, hogy Get- A véletlenszerűen úgy viselkedik, mintha természetesen elvárnánk, de erre a forgatókönyvre nem lesz szükségünk.

2. rész: A felhasználói bevitel és az üzembe helyezés

Míg egy olyan script, amely csak egy véletlenszerű nevet és /a telefonszám nagyszerű, sokkal jobb, ha a szkript lehetővé teszi a felhasználó számára, hogy hány név &azok a számok, amelyeket egy tételben szeretnének kapni. Sajnos nem igazán bízhatunk a felhasználókban, hogy mindig érvényes bevitelt adjanak.Így van egy kicsit több, mint az $ UserInput = Read-Host .

miközben( ! $ ValidInput){ try{ [int] $ UserInput = Read-Host -Prompt 'Generálandó elemek' $ ValidInput = $ true} catch{ Write-Host 'Érvénytelen bemenet. Adjon meg egy számot. "-ForegroundColor Red}}

A fenti statement utasítás a $ ValidInput értékét ellenőrzi és elutasítja. Mindaddig, amíg a $ ValidInput hamis, vagy nem létezik, a szkriptblokkján keresztül meg fog tartani.

A próba utasítás felhasználói beolvasást hajt végre a Read-Host segítségével és megpróbálja átszámítani egy egész értékre.(Ez az [int] , mielőtt Read-Host lesz.) Ha sikeres lesz, a $ ValidInput értéket true értékre állítja, hogy a while hurok kiléphessen. Ha nem sikerült, akkor a fogási blokk hibát jelez, és mivel a $ ValidInput nem lett beállítva, a hurok vissza fog térni, és ismét megkérdezi a felhasználót.

Miután a felhasználó megfelelően megadta a számot bemenetként, azt szeretnénk, ha a szkript bejelentette, hogy elkezdi ténylegesen elvégezni a munkáját, majd megpróbálja végrehajtani.

Write-Host "` nGeneráló $ UserInput nevek és telefonszámok Kérjük, legyen türelemmel.`n "1. . $ UserInput |ForEach-Object{ & lt; # INSERT RANDOM NAME &NUMBER GENERATOR HERE # & gt;}

Ne aggódj, nem fogunk hagyni önmagunkban, hogy kitaláljuk a véletlenszerű nevet ésszámgenerátor kódot. Ez csak egy helyőrző megjegyzés, amely megmutatja, hogy hol lesz a következő rész( ahol az igazi munkát végezzük).

A Write-Host sor nagyon egyszerű.Egyszerűen megmondja, hogy hány nevet és telefonszámot generál a szkript, és arra kéri a felhasználót, hogy türelmes legyen, amíg a szkript dolgozik. Az `n a string elején és végén egy üres sor beillesztése a kimenet előtt és után, csak azért, hogy némi vizuális elválasztható legyen a bemeneti sor és a névlista között.számokat. Ne felejtsük el, hogy ez egy back-tick( AKA "súlyos akcentus" - általában a fenti fül, bal oldalán 1), és nem egy aposztróf vagy egy-idézet az egyes n előtt.

A következő rész más módon mutatja be a ForEach-Object hurok használatát.Általában, ha egy parancsfájl blokkot szeretne futtatni egy bizonyos számú alkalommal, akkor rendszeresen beállítja a hurokra, mint az ( $ x = 1; $ x -le $ UserInput; $ x ++){ & lt; # INSERT SCRIPTItt # & gt;}. A ForEach-Object lehetővé teszi számunkra, hogy egyszerűsítsük ezt azáltal, hogy megadja az egész számok listáját, és ahelyett, hogy azt mondaná, hogy ténylegesen bármit is csinál ezekkel az egész számokkal, csak add meg egy statikus szkriptblokkot, amíg az egész számokból kifogy az egész.

3. rész: Véletlen név létrehozása

A név létrehozása a folyamat legelején a legegyszerűbb bit. Ez csak három lépésből áll: Családnévválasztás, nemek kiválasztása és névválasztás. Ne feledje, hogy az álnevet, amelyet a Get-Random-nek még egyszer hoztunk létre? Ideje elkezdeni ezt használni.

$ Surname = Get-Content "$ ScriptFolder \ Surnames.txt" |g $ Férfi = g 2 ha( $ Férfi){ $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" |g} else{ $ FirstName = Get-Tartalom "$ ScriptFolder \ Females.txt" |g}

Az első sor a vezetéknevek listáját veszi át, beviszi a véletlenszerű kiválasztóba, és a kiválasztott nevet $ Családi névhez rendel.

A második sor a személyünk nemét veszi fel. Emlékezzen arra, hogy a Get-Random hogyan kezd számolni nulláról, és hogy a nulladik mennyire hamis, és minden más igaz?Így használjuk az Get-Random 2 -et( vagy a sokkal rövidebb g 2 -t az aliasunknak köszönhetően - mindkettő választása nulla vagy egy), hogy eldöntsük, vajon férfi vagy sem. Az if / else utasítás utána véletlenszerűen kiválaszt egy férfi vagy női utónevet ennek megfelelően.

4. rész: Véletlenszerű telefonszám létrehozása

Itt van az igazán szórakoztató rész. Korábban megmutattuk Önnek, hogy számos módja van arra, hogy érvénytelen vagy fiktív telefonszámot hozzon létre. Mivel nem akarjuk, hogy minden számunk túlságosan hasonlítson egymásra, véletlenszerűen minden esetben érvénytelen formátumot választunk. A véletlenszerűen kiválasztott formátumokat területkód és Exchange kódja határozza meg, amelyet együttesen $ Prefixként tárolnak.(G 10) $( g 10)) $( g 10) $( g 10) $( g 10) $( g 10) $( g 10) $( g 10) $

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

Az első sor egy egyszerű véletlenszám-generálás,a telefonszámot követni fogjuk. Ezután a kapcsoló utasításban véletlenszerű választási lehetőséget ad, és ennek megfelelően $ Prefixet generál. Ne feledje, hogy az érvénytelen telefonszám típusok listája? A $ NumberFormat értékek 0-3 megfelelnek az első négynek a listában. A 4-es érték az egyik utolsó kettőt generálhatja, mivel mindkettő használja az "555" Exchange kódot.

Itt láthatjuk, hogy egy másik trükköt használunk dupla idézőjelekkel. A kettős idézőjelek nemcsak a változók értelmezését teszik lehetővé, mielőtt a szöveg leadásra kerül - ők is lehetővé teszik a parancsfájlok feldolgozását. Ehhez az alábbi parancsfájlblokkot kell beillesztened: "$( & lt; #SCRIPT HERE # & gt;)" .Tehát az, ami fent van, sok egyénileg véletlenszerű számjegy, amelyek közül néhány korlátozott tartományban van, vagy statikusan a szabályoknak megfelelően. Minden karakterlánchoz olyan zárójelek is vannak, mint a normál esetben a körzetszám és az Exchange-kód párjában.

Az utolsó dolog, amit meg kell tennünk, mielőtt készen állunk arra, hogy a nevünket &a telefonszám előállítói azonosítót generál, amelyet $ Suffixként tárolnak.

kapcsoló( $ NumberFormat){ {$ _ -lt 4}{ $ Suffix = "$( g 10) $( g 10) $( g 10) $( g 10)"}(800) 555 '{$ Suffix =' 0199 '} alapértelmezett{ $ Suffix = "01 $( g 10) $( g 10)"}}}}

Az 555 számra vonatkozó speciális szabályok miatt nem csaknégy véletlen számjegyet generál minden olyan telefonszám végére, amelyet a forgatókönyvünk készíteni fog. Tehát az első kapcsoló ellenőrzi, hogy van-e egy 555 számmal. Ha nem, négy véletlen számot generál. Ha ez egy 555-ös szám, akkor a második kapcsoló ellenőrzi a 800-as körzetszámot. Ha ez megegyezik, akkor csak egy érvényes $ utótag használható.Ellenkező esetben a 0100-0199 között bármikor választhat.

Felhívjuk a figyelmet arra, hogy van néhány különböző módja ennek a blokknak a megírására, ahelyett, hogy így lenne. Mindkét kapcsoló kijelentést ki lehetett cserélni az if / else utasításokkal, mivel mindegyik csak két választási lehetőséget kezel. Továbbá, ahelyett, hogy kifejezetten "4" -nek nevezte volna az első kapcsoló nyilatkozatának opcióját, akkor az "alapértelmezett" változatot hasonlóan használhatta a másodiknál, mivel ez volt az egyetlen lehetőség. Az if / else vs. switch kapcsolók közötti választás, illetve az alapértelmezett kulcsszó használata a meghatározott értékek helyett gyakran a személyes preferencia kérdése. Mindaddig, amíg működik, használjon mindent, amire a legkényelmesebb.

Most itt az ideje a kimenetnek.

írás-kimenet "$ FirstName $ Családi vezetéknév $ Prefix- $ utótag"}

Ez eléggé egyszerű, mint amennyit a script kap. Csak az első és a vezetéknevet adja ki szóközzel elválasztva, majd egy másik helyet a telefonszám előtt. Itt található az Exchange kód és az Előfizetői azonosító közötti szabványos kötőjel is.

Ez a zárótag az alsó résznél a ForEach-Object hurok vége a korábbiak közül - figyelmen kívül hagyja ezt, ha már megkapta.

5. rész: A szkript megtisztítása és futtatása

Miután elvégezte a munkát, egy jó szkript tudja, hogyan takarítható meg önmagát követően. Ismételten az alábbi változó eltávolítás nem feltétlenül szükséges, ha csak a parancsfájlt futtatja a konzolról, de szeretné, ha az ISE-ben futtatná.

Remove-Item alias: \ g Remove-Változó ScriptFolder, RequiredFiles, Családnév, Férfi, FirstName, NumberFormat, Előtag, Utótag, ValidInput, UserInput

Miután mindent megtett, mentse el a parancsfájlt ".ps1" kiterjesztésselugyanabban a mappában, mint a nevek. Győződjön meg róla, hogy a ExecutionPolicy úgy van beállítva, hogy a parancsfájl fusson, és adjon egy örvényt.

Az alábbi parancsfájlról készült képernyőkép:

A PowerShell parancsfájlt és a névlistákkal ellátott szövegfájlokat az alábbi linkről is letöltheti.

Véletlen név &Telefonszám generátor a PowerShell

-hez