Homepage » hogyan kell » Véletlen nevek és telefonszámok generálása a PowerShell segítségével

    Véletlen nevek és telefonszámok generálása a PowerShell segítségével

    Ha a teszteléshez vagy bemutatáshoz szükséges adatkészletre van szükség, és ez a készlet személyesen azonosítható információt (PII) kell képviselnie, általában nem akar valós adatokat használni, amelyek a tényleges embereket képviselik. Itt meglátogatjuk, hogyan lehet a PowerShell segítségével létrehozni egy véletlen nevek és telefonszámok listáját egy ilyen alkalomra.

    Amire szükséged van

    Mielőtt elkezdené, néhány eszközt és információt meg kell adnia:

    PowerShell

    Ezt a forgatókönyvet a PowerShell 4.0 alkalmazásával fejlesztették ki, és tesztelték a kompatibilitást a PowerShell 2.0-val. A Windows 7 alatt a PowerShell 2.0 vagy újabb verziója beépült a Windows rendszerbe. A Windows XP és Vista operációs rendszerekhez a Windows Management Framework (WMF) részeként is elérhető. Az alábbiakban néhány további részlet és a letöltésekre vonatkozó hivatkozások találhatók.

    • A Windows XP SP3 és Vista (SP1 vagy újabb) felhasználók letölthetik a megfelelő WMF-verziót a Microsoft-tól a KB968929-ben. Nem támogatott az XP SP2 vagy újabb verziója, vagy a Vista SP1 nélkül.
    • A PowerShell 4.0 a Windows 8.1 rendszerrel érkezik. A Windows 7 SP1-felhasználók a WMF-frissítés részeként frissíthetik a Microsoft letöltőközpontjából. Nem érhető el XP vagy Vista esetén.

    nevek

    Szükséged lesz néhány névsorra a véletlen generátorba való betápláláshoz. Nagyszerű forrás a sok a nevek és a népszerűségükre vonatkozó információk (bár ez nem fogják használni ezt a forgatókönyvet), az Egyesült Államok népszámlálási irodája. Az alábbi linkeken elérhető listák nagyon nagyok, ezért lehet, hogy kicsit kicsinyítjük őket, ha sok nevet és számot akarunk létrehozni egyszerre. Tesztrendszerünkben minden név / szám pár körülbelül 1,5 másodpercet vett igénybe a teljes listák létrehozásához, de a kilométered a saját rendszeradatoktól függően változhat.

    • vezetéknevek
    • Férfi első nevek
    • Női első nevek

    Függetlenül attól, hogy milyen forrást használ, létre kell hoznia három olyan szövegfájlt, amelyeket a szkript a nevek kiválasztásában poolként használhat. Minden fájlnak csak neveket kell tartalmaznia, és csak egy nevet kell megadnia soronként. Ezeket ugyanabban a mappában kell tárolni, mint a PowerShell script.

    Surnames.txt tartalmaznia kell azokat a vezetékneveket, amelyek közül a szkript választani kíván. Példa:

    Smith Johnson Williams Jones Brown

    Males.txt tartalmaznia kell a férfiak első nevét, akitől a szkript választja. Példa:

    James John Robert William

    Females.txt tartalmaznia kell azokat a női előneveket, amelyek közül a szkriptet szeretné kiválasztani. Példa:

    Mary Patricia Linda Barbara Elizabeth

    A telefonszámok szabályai

    Ha biztosítani szeretné, hogy a telefonszámok nem egyeznek meg valaki valódi telefonszámával, a legegyszerűbb a jól ismert „555” Exchange kód használata. De ha sok telefonszámmal rendelkező adatkészletet mutat be, akkor az 555-ös meglehetősen egyszerû, valódi gyors lesz. Ahhoz, hogy a dolgok érdekesebbé váljanak, más telefonszámokat generálunk, amelyek megsértik az észak-amerikai számozási terv (NANP) szabályait. Az alábbiakban néhány példát érvénytelen telefonszámok jelennek meg, amelyek a szkript által generált minden egyes osztályt képviselik:

    • (157) 836-8167
      Ez a szám érvénytelen, mert a területkódok nem kezdődhetnek 1 vagy 0-val.
    • (298) 731-6185
      Ez a szám érvénytelen, mert a NANP nem rendel 9-ös területkódot 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-mal.
    • (752) 811-1375
      Ez a szám érvénytelen, mert az Exchange-kódok nem zárhatók le két 1-esével.
    • (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-as szám, amelynek 555 Exchange-kódja fiktív számként van fenntartva.

    Ne feledje, hogy a fenti szabályok változhatnak és a joghatóság szerint változhatnak. Meg kell tennie saját kutatását, hogy ellenőrizze az aktuális szabályokat, amelyek azokra a helyekre vonatkoznak, amelyekre telefonszámokat generál.

    Közös parancsok

    Vannak meglehetősen gyakori parancsok, amelyeket az egész szkriptben használni fognak, így alapvető elképzelést kell kapnunk arról, hogy mit jelentenek ezek a jelentések, mielőtt bemegyünk a tényleges írásba..

    • Foreach-Object az objektumok tömbjét vagy listáját veszi fel, és mindegyikén elvégzi a megadott műveletet. A ForEach-Object szkriptblokkban a $ _ változó az aktuális elem feldolgozására utal.
    • ha más a nyilatkozatok 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 ez a feltétel nem teljesül.
    • kapcsoló a kijelentések olyanok, mintha a választások több választással rendelkeznének. A kapcsoló több objektum ellenõrzése ellenõrzi az objektumot, és futtatja a parancsfájlblokkokat az objektum egyezésének feltételeihez. Opcionálisan megadhat egy alapértelmezett mondatot is, amely csak akkor fog futni, ha nincs más feltétel. A kapcsolási utasítások a $ _ változót is használják az aktuális feldolgozásra kerülő elemre.
    • míg az állítások lehetővé teszik, hogy folyamatosan megismételje a parancsfájlblokkot, amennyiben egy bizonyos feltétel teljesül. Amint valami történik, ami miatt a feltétel már nem igaz, amikor a script blokk befejeződött, a hurok kilép.
    • próbáljon… elkapni nyilatkozatok segítenek a hibakezelésben. Ha valami meghibásodik a próbálkozáshoz megadott parancsfájlblokkmal, akkor a fogási blokk fut.
    • Get-Content megteszi, mit mond az ón. Kap egy adott objektum tartalmát - általában egy fájlt. Ez használható a szöveges fájl tartalmának megjelenítésére a konzolon, vagy, mint ebben a szkriptben, átadja a tartalmat a csővezeték mentén, amelyet más parancsokkal kell használni..
    • Write-Host hozza a dolgokat a konzolba. Ezt használják az üzeneteknek a felhasználó számára történő megjelenítésére, és nem szerepel a parancsfájl kimenetén, ha a kimenet átirányításra kerül.
    • Write-Output ténylegesen generál kimenetet. Általában ez a konzolba kerül, de más parancsokkal is átirányítható.

    Vannak más parancsok a szkriptben, de elmagyarázzuk azokat.

    A Script létrehozása

    Itt az ideje, hogy piszkos a kezünk.

    1. rész: Készen áll a Go-ra

    Ha úgy tetszik, hogy a parancsfájl egy tiszta konzolról indul, itt van az első sor.

    Tiszta-Host

    Most, hogy tiszta képernyőn van, a következő dolog, amit meg akarunk csinálni, a szkript ellenőrzése annak biztosítására, hogy minden szükséges legyen a helyén. Ehhez el kell kezdenünk azzal, hogy elmondjuk, hogy hol keressünk, és mit keressünk.

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

    Az első sor nagyon hasznos minden szkript számára. Olyan változót határoz meg, amely a parancsfájlt tartalmazó mappára mutat. Ez elengedhetetlen, ha a szkript más fájlokat is igényel, amelyek ugyanabban a könyvtárban találhatók, mint maga (vagy egy ismert relatív út a könyvtárból), mert egyébként hibák lépnek fel, ha és amikor megpróbál futtatni a szkriptet egy másikban munkakönyvtár.

    A második sor olyan fájlnevek tömbjét hozza létre, amelyek szükségesek ahhoz, hogy a szkript megfelelően futhasson. 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 if (! (Test-Path "$ ScriptFolder $ _")) Write-Host "$ _ nem található." -ForegroundColor Red $ MissingFiles ++

    Ez a szkriptrész a $ RequiredFiles tömböt egy ForEach-Object blokkba küldi. A parancsfájlblokkban az if utasítás a Tesztutat használja, hogy megnézze, hogy a keresett fájl az, hogy hol található. A Test-Path egy egyszerű parancs, amely a fájl elérési útjának megadásakor visszaad egy alapvető vagy hamis választ, hogy elmondja nekünk, hogy az elérési utat valami létezik-e. A felkiáltójel van egy nem operátor, amely megfordítja a tesztút válaszát, mielőtt továbbítja azt az if utasításhoz. Tehát, ha a Test-Path visszaadja a false (azaz a keresett fájlt nem létezik), akkor igazvá lesz alakítva, hogy az if utasítás végrehajtja a script blokkját.

    Egy másik dolog, amit itt meg kell jegyezni, amelyet gyakran használnak ebben a szkriptben, az egy-idézetek helyett kettős idézetek használata. Ha valamit idézőjelekbe teszel, a PowerShell statikus karakterláncként kezeli. Bármi legyen az egyes idézetekben, pontosan úgy kerül sor, mint amilyen az. A kettős idézetek azt mondják a PowerShellnek, hogy lefordítsa a változókat és néhány más speciális elemet a karakterláncon belül, mielőtt továbbítaná. Itt a kettős idézetek azt jelentik, hogy a futás helyett Tesztútvonal $ ScriptFolder  tényleg többet fogunk csinálni C-tesztút: parancsfájlok Vezetéknevek.txt ' (feltételezve, hogy a parancsfájlja C: A parancsfájlok, és a ForEach-Object jelenleg a.

    Az összes fájl nem található, az Írás-fogadó piros üzenetben hibaüzenetet küld, hogy elmondja, hogy melyik fájl hiányzik. Ezután növeli a $ MissingFiles változót, amely a következő darabban fog felhasználni, hogy hiba és kilépjen, ha hiányoznak a fájlok..

    ha ($ MissingFiles) Write-Host "Nem található a $ MissingFiles forrásfájl (ok). -ForegroundColor Red eltávolítható változó ScriptFolder, RequiredFiles, MissingFiles Exit

    Itt van egy másik szép trükk, amit tehetünk, ha nyilatkozatok vannak. A legtöbb útmutatók arról fognak látni, hogy a nyilatkozatok megkövetelik-e, hogy egy operátor segítségével ellenőrizze a megfelelő feltételeket. Például itt használhatnánk ha ($ MissingFiles -gt 0) látni, hogy a $ MissingFiles nagyobb-e nullánál. Ha azonban már olyan parancsokat használ, amelyek egy logikai értéket adnak vissza (mint az előző blokkban, ahol teszt-útvonalat használtunk), ez nem szükséges. Ilyen esetekben is tehetünk anélkül, hogy csak akkor próbálkoznánk, ha egy szám nem nulla. Bármely nem nulla szám (pozitív vagy negatív) igaznak tekinthető, míg a nulla (vagy, mint itt, nem létező változó) hamisnak tekintendő.

    Ha a $ MissingFiles létezik, és nem nulla, az Írás-fogadó üzenetet küld, amelyben elmondja, hogy hány fájl hiányzik, és hogy 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 parancsfájlból. A rendszeres PowerShell konzolon a Remove-Variable nem szükséges erre a célra, mivel a parancsfájlok által beállított változók általában eldobnak, amikor a parancsfájl kilép. A PowerShell ISE azonban kicsit másképp viselkedik, így érdemes megtartani ezt, ha azt tervezi, hogy onnan futtatja a szkriptet.

    Ha minden dolog rendben van, a parancsfájl tovább folytatódik. Egy újabb előkészítés egy álnév, amit igazán örülünk majd később.

    New-Alias ​​g Get-Random

    Az álnevek a parancsok alternatív neveinek létrehozására szolgálnak. Ezek hasznosak lehetnek abban, hogy megismerjük az új felületet (pl. A PowerShell beépített álnevekkel rendelkezik dir -> Get-ChildItem és macska -> Get-Content), vagy rövid hivatkozásokra az általánosan használt parancsokra. Itt egy nagyon rövidre mutató hivatkozás a Get-Random parancsot, amelyet sokkal később fognak használni.

    A Get-Random elég sok mindent megtesz, amit a neve is jelez. Egy tömböt (mint a nevek listáját), mint bevitelt, egy véletlenszerű elemet választ ki a tömbből, és kivágja. Alkalmazható véletlen számok létrehozására is. A Get-Randomról és a számokról emlékeznünk kell, hogy sok más számítógépes művelethez hasonlóan nulláról is számít. Tehát ahelyett, hogy Get-Random 10 ami azt jelenti, hogy minél természetesebben „adjon számot 1-től 10-ig”, valójában azt jelenti, hogy „adjon számot 0-tól 9-ig.” Ön pontosabb lehet a számkiválasztással kapcsolatban, hogy a Get-Random jobban viselkedjen, mint természetesen várható, de ebben a szkriptben nem lesz rá szükség.

    2. rész: A felhasználói bevitel és a munka megkezdése

    Míg egy szkript, amely csak egy véletlen nevet és telefonszámot generál, nagyszerű, sokkal jobb, ha a parancsfájl lehetővé teszi a felhasználó számára, hogy megadja, hogy hány nevet és számot szeretne kapni egy tételben. Sajnos nem igazán bízhatunk meg a felhasználókban, hogy mindig érvényes bemenetet adjanak. Tehát van egy kicsit több, mint ez $ UserInput = Read-Host.

    míg (! $ ValidInput) try [int] $ UserInput = Read-Host -Prompt 'generálandó elemek' $ ValidInput = $ true catch Írás-Host "Érvénytelen bemenet. Csak egy számot írjon be. ' -ForegroundColor Red

    A fenti nyilatkozat a $ ValidInput értékét ellenőrzi és elutasítja. Mindaddig, amíg a $ ValidInput hamis, vagy nem létezik, a parancsfájlblokkon keresztül fog folytatni.

    A próbadarab a felhasználói bemenetet a Read-Host segítségével veszi át, és megpróbálja átalakítani egész számra. (Az a [Int] Read-Host előtt.) Ha sikeres, akkor a $ ValidInput értéket igazra állítja, így a ciklus kiléphet. Ha nem sikerül, a fogási blokk hibaüzenetet jelenít meg, és mivel a $ ValidInput nem kapott beállítást, a hurok vissza fog térni és újra felkéri a felhasználót.

    Miután a felhasználó megadta a számot bemenetként, azt szeretnénk, ha a szkript bejelenti, hogy hamarosan elkezdi ténylegesen elvégezni a munkáját, majd megkapja azt..

    Írjon-Host "'nGeneráló $ UserInput neveket és telefonszámokat. Kérjük, legyen türelmes.'n" 1… $ UserInput | ForEach-Object 

    Ne aggódj, nem hagyjuk magunkat, hogy kitaláljuk a véletlenszerű név és szám generátor kódját. Ez csak egy helyőrző megjegyzés, amely megmutatja, hogy a következő szakasz (ahol az igazi munka megtörténik) megmutatkozik.

    Az író-host sor elég egyszerű. Egyszerűen azt mondja, hogy hány nevet és telefonszámot fog generálni a szkript, és kéri a felhasználót, hogy legyen türelmes, miközben a parancsfájl működik. A„n a karakterlánc elején és végén egy üres sort kell beillesztenie a kimenet előtt és után, hogy a vizuális elválasztás legyen a bemeneti vonal és a nevek és számok listája között. Legyen tudatában annak, hogy ez egy back-tick (AKA „súlyos akcentus” - általában a lap fölötti kulcs, az 1-től balra), és nem egy apostróp vagy egy-egy idézet mindegyik előtt. n.

    A következő rész a ForEach-Object hurkot más módon mutatja. Jellemzően, ha egy parancsfájlblokkot bizonyos számú alkalommal futtat, akkor rendszeres hurkot szeretne beállítani a ($ x = 1; $ x -le $ UserInput; $ x ++) . A ForEach-Object lehetővé teszi számunkra, hogy egyszerűsítsük ezt az egész számok listájával, és ahelyett, hogy azt mondanánk, hogy valóban bármit is csinálna az egész számokkal, csak statikus parancsfájlblokkot adunk meg, amíg az egész számokból nem fut le..

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

    A név létrehozása a folyamat legegyszerűbb bitje. Ez csak három lépésből áll: Vezetéknév kiválasztása, nemek kiválasztása és első név kiválasztása. Ne feledje, hogy alias, amit a Get-Random-ra készítettünk egy darabig? Ideje elkezdeni a használatát.

        $ Vezetéknév = Tartalomjegyzék "$ ScriptFolder" Vezetéknevek.txt " g $ Male = g 2, ha ($ Male) $ FirstName = Get-Content "$ ScriptFolder \ t g else $ FirstName = Get-Content "$ ScriptFolder \ t g

    Az első sor a vezetéknevek listáját veszi fel, betáplálja a véletlenszerkesztőbe, és hozzárendeli a kiválasztott nevet $ Surname.

    A második sor felveszi a személy nemét. Emlékezzünk arra, hogy a Get-Random nulláról számol, és hogy a nulla hamis, és minden más igaz? Így használjuk Get-Random 2 (vagy sokkal rövidebb g 2 álnevünknek köszönhetően mindkettő nulla vagy egy közötti választást eredményez, hogy eldönthessük, hogy személyünk férfi vagy nem. Az if / más utasítás későbbi véletlenszerűen egy férfi vagy női előnevet választ.

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

    Itt van az igazán szórakoztató rész. Korábban megmutattuk, hogy számos módon lehet érvénytelen vagy fiktív telefonszámot készíteni. Mivel nem szeretnénk, ha minden számunk túlságosan hasonlít egymásra, minden alkalommal véletlenszerűen választunk egy érvénytelen számformátumot. A véletlenszerűen kiválasztott formátumokat a területkód és az Exchange-kód határozza meg, amely együttesen $ Prefix-ként kerül tárolásra.

        $ NumberFormat = g 5 kapcsoló ($ 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 "

    Az első sor egy egyszerű véletlen szám generáció, melynek segítségével kiválaszthatja, hogy melyik formátumban fogjuk követni a telefonszámot. Ezután a kapcsolási utasítás ezt a véletlenszerű választást veszi figyelembe, és ennek megfelelően létrehoz egy $ prefixet. Emlékezzen az érvénytelen telefonszámok listájára? A 0-3 $ NumberFormat értékek megfelelnek a listában szereplő első négynek. A 4. érték az utolsó kettő egyikét generálhatja, mivel mindkettő az „555” Exchange kódot használja.

    Itt is láthatjuk, hogy egy másik trükköt használunk kettős idézetekkel. A kettős idézetek nem csak azt teszik lehetővé, hogy értelmezzék a változókat, mielőtt egy karakterlánc kimenetre kerülne, hanem a parancsfájlblokkokat is feldolgozhatják. Ehhez a következő forgatókönyvet blokkolja: „$ ()”. Tehát a fentieken túl sok egyénileg véletlenszerűen számozott számjegy van, amelyek közül néhányuk korlátozott, vagy statikusan van beállítva a követendő szabályok szerint. Minden sztring zárójelben és távolságban van, ahogyan azt általában várni fogod egy körzetkódban és az Exchange kód párban.

    Az utolsó dolog, amit meg kell tennünk, mielőtt készen állunk a név és telefonszám kiadására, az az, hogy létrehozzunk egy előfizetői azonosítót, amely $ Suffix.

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

    Az 555-ös számokra vonatkozó speciális szabályok miatt nem tudunk csak négy véletlen számjegyet létrehozni minden telefonszámunk végén, amit a szkriptünk készít. Tehát az első kapcsoló ellenőrzi, hogy 555-ös számmal foglalkozunk. Ha nem, négy véletlen számjegyet generál. Ha ez egy 555 szám, akkor a második kapcsoló ellenőrzi a 800 körzetszámot. Ha ez megegyezik, csak egy érvényes $ utótag használható. Ellenkező esetben bármit is választhat a 0100-0199 között.

    Ne feledje, hogy van néhány különböző módja annak, hogy ezt a blokkot lehetett volna írni ahelyett, ahogyan van. Mindkét kapcsolási utasítás helyettesíthető volna if / más állításokkal, mivel mindegyikük csak két választási lehetőséggel rendelkezik. Ahelyett, hogy kifejezetten a „4” -et választotta volna az első kapcsolási nyilatkozathoz, az „alapértelmezett” -et hasonlóan lehetett volna használni, mint ahogyan azt a második lépésben elvégezték, mivel az egyetlen lehetőség maradt. A választás az if / más és a kapcsoló között, vagy ha az alapértelmezett kulcsszót a konkrét értékek helyett használjuk, gyakran személyes preferenciákhoz jut. Mindaddig, amíg az működik, használjon mindent, amit leginkább szeretne.

    Most itt az ideje a kimenetnek.

        Írás-kimenet "$ FirstName $ vezetéknév $ prefix - $ utótag"

    Ez nagyon egyszerű, mint a szkriptben. Csak a szóközzel elválasztott első és utolsó nevet adja ki, majd egy másik helyet a telefonszám előtt. Itt van, ahol hozzáadódik az Exchange kód és az előfizetői azonosító közötti szabványos kötőjel is.

    Az alsó záró zárójel a ForEach-Object hurok vége a korábbi - kihagyja ezt, ha már megvan.

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

    Miután minden munka megtörtént, egy jó szkript tudja, hogyan kell megtisztítani magát. Ismét az alábbi változó eltávolítása valójában nem szükséges, ha csak a konzolt futtatja a parancsfájlt, de azt akarja, ha azt tervezi, hogy az ISE-ben futtatja..

    Eltávolítás-Elem alias: g Változó ScriptFolder, RequiredFiles, Vezetéknév, Male, FirstName, NumberFormat, Prefix, Suffix, ValidInput, UserInput

    Miután megtörtént mindent elvégezni, mentse a parancsfájlt a ".ps1" kiterjesztéssel a nevek fájljaival azonos mappába. Győződjön meg róla, hogy az ExecutionPolicy beállítása úgy van beállítva, hogy a parancsfájl futtatható legyen, és forgassa el.

    Itt van egy képernyőkép a cselekvésből:

    Az alábbi linkről letölthet egy ZIP fájlt is, amely tartalmazza ezt a PowerShell parancsfájlt, és szöveges fájlokat névlistákkal.

    Véletlen név és telefonszám generátor a PowerShell számára