Domovská » jak » Jak generovat náhodná jména a telefonní čísla s PowerShell

    Jak generovat náhodná jména a telefonní čísla s PowerShell

    Když potřebujete sadu dat pro testování nebo demonstraci a tato množina musí představovat osobní identifikační údaje (PII), obecně nechcete používat skutečná data, která představuje skutečné lidi. Zde vás budeme informovat, jak můžete použít PowerShell pro generování seznamu náhodných jmen a telefonních čísel pro takovou příležitost.

    Co potřebuješ

    Než začnete, máte k dispozici některé nástroje a informace, které byste měli mít:

    PowerShell

    Tento skript byl vyvinut pomocí programu PowerShell 4.0 a také byl testován na kompatibilitu s PowerShell 2.0. PowerShell 2.0 nebo novější je v systému Windows vestavěn od Windows 7. Je také k dispozici pro Windows XP a Vista jako součást Windows Management Framework (WMF). Některé další podrobnosti a odkazy ke stažení jsou níže.

    • PowerShell 2.0 je dodáván se systémem Windows 7. Uživatelé Windows XP SP3 a Vista (SP1 nebo novější) mohou stáhnout příslušnou verzi WMF od společnosti Microsoft v KB968929. Není podporován v systémech XP SP2 nebo nižší, nebo Vista bez SP1.
    • PowerShell 4.0 je dodáván se systémem Windows 8.1. Uživatelé systému Windows 7 SP1 mohou aktualizovat tuto aktualizaci jako součást aktualizace WMF ze služby Stažení softwaru společnosti Microsoft. Není k dispozici pro XP nebo Vista.

    Jména

    Budete potřebovat nějaké seznamy názvů, které chcete přenést do generátoru náhodných čísel. Skvělý zdroj pro hodně jména a informace o jejich popularitě (ačkoli to nebude použito pro tento skript), je americký sčítání lidu Bureau. Seznamy, které jsou k dispozici na níže uvedených odkazech, jsou velmi velké, takže možná budete chtít trochu ořezat, pokud hodláte generovat mnoho jmen a čísel najednou. Na našem zkušebním systému, každý pár / jméno trval přibližně 1,5 sekundy, aby se vygeneroval pomocí úplných seznamů, ale vaše míle se bude lišit v závislosti na vašem vlastním systému.

    • Příjmení
    • Mužské první jména
    • První jména žen

    Bez ohledu na zdroj, který používáte, budete muset vygenerovat tři textové soubory, které může skript použít jako sady pro výběr názvu. Každý soubor by měl obsahovat pouze jména a pouze jedno jméno na jeden řádek. Ty musí být uloženy ve stejné složce jako skript PowerShell.

    Surnames.txt by měl obsahovat příjmení, ze kterých chcete vybrat skript. Příklad:

    Smith Johnson Williams Jones Brown

    Males.txt by měla obsahovat jména, z nichž chcete vybrat skript. Příklad:

    James John Robert Michael

    Females.txt by měla obsahovat jména prvních jmen, od kterých chcete vybrat skript. Příklad:

    Mary Patricia Linda Barbara Elizabeth

    Pravidla pro telefonní čísla

    Chcete-li si být jisti, že vaše telefonní čísla neodpovídají skutečnému telefonnímu číslu někoho, nejjednodušší je použít známý Exchange Code "555". Pokud však chcete zobrazovat sadu dat s mnoha telefonními čísly, začne 555 vypadat docela monotónně. Chcete-li, aby byly věci zajímavější, vygenerujeme další telefonní čísla, která porušují pravidla NANP (North American Numbering Plan). Níže uvádíme několik neplatných telefonních čísel, které představují každou třídu čísel, která bude generována tímto skriptem:

    • (157) 836-8167
      Toto číslo je neplatné, protože oblastní kódy nemohou začít s 1 nebo 0.
    • (298) 731-6185
      Toto číslo je neplatné, protože NANP nepřiděluje kódy oblastí s číslem 9 jako druhou číslici.
    • (678) 035-7598
      Toto číslo je neplatné, protože kódy Exchange nelze začít s 1 nebo 0.
    • (752) 811-1375
      Toto číslo je neplatné, protože kódy Exchange nelze ukončit dvěma 1 s.
    • (265) 555-0128
      Toto číslo je neplatné, protože kód Exchange je 555, a ID předplatitele je v rozsahu vyhrazeném pro fiktivní čísla.
    • (800) 555-0199
      Toto číslo je jediné 800 číslo s 555 Exchange kódem, který je vyhrazen pro použití jako fiktivní číslo.

    Upozorňujeme, že uvedená pravidla mohou být změněna a mohou se lišit podle jurisdikce. Měli byste udělat svůj vlastní průzkum, abyste ověřili aktuální pravidla, která se vztahují na místní prostředí, pro které budete vytvářet telefonní čísla.

    Společné příkazy

    Existují některé poměrně běžné příkazy, které se budou používat v celém tomto skriptu, takže byste měli získat základní představu o tom, co to znamená, než se ponoříme do skutečného psaní.

    • ForEach-Object vezme pole nebo seznam objektů a provádí zadanou operaci na každém z nich. V rámci bloku skriptů ForEach-Object se proměnná $ _ používá k odkazu na aktuální zpracovanou položku.
    • pokud ... jinak příkazy umožňují provádět operaci pouze v případě, že jsou splněny určité podmínky, a (volitelně) určit, co by mělo být provedeno, pokud není splněna tato podmínka.
    • přepínač prohlášení jsou jako kdyby prohlášení s více volbami. Přepínač zkontroluje objekt proti několika podmínkám a spustí libovolné bloky skriptů pro podmínky, které odpovídají danému objektu. Můžete také volitelně určit výchozí blok, který se spustí pouze v případě, že nejsou splněny žádné další podmínky. Příkazy switch také používají proměnnou $ _, aby se odkazovaly na aktuální zpracovanou položku.
    • zatímco příkazy umožňují nepřetržitě opakovat blok skriptu, pokud je splněna určitá podmínka. Jakmile se stane něco, co způsobí, že podmínka přestane být pravdivá po dokončení bloku skriptu, ukončí se smyčka.
    • Zkus chytit příkazy pomáhají při manipulaci s chybami. Pokud do bloku skriptů, které jste zadali při pokusu, dojde k chybě, zablokuje se blok chyby.
    • Získat obsah dělá to, co říká na plechu. Získává obsah určeného objektu - obvykle soubor. Toto může být použito k zobrazení obsahu textového souboru na konzoli nebo, stejně jako v tomto skriptu, předat obsah podél potrubí pro použití s ​​dalšími příkazy.
    • Host-Write dává věci do konzoly. Používá se k předkládání zpráv uživateli a není zahrnuto do výstupu skriptu, pokud je výstup přesměrován.
    • Výstup zápisu ve skutečnosti generuje výstup. Za normálních okolností je toto do konzoly přenášeno, ale může být také přesměrováno jinými příkazy.

    Existují další příkazy ve skriptu, ale vysvětlíme jim, jak jdeme.

    Vytváření skriptu

    Nyní je čas, abychom našli špinavé ruce.

    Část 1: Připravte se na cestu

    Pokud se vám líbí, aby váš skript začal běžet z čisté konzoly, je zde první řádek, který chcete v ní.

    Clear-Host

    Nyní, když máme čistou obrazovku, další věc, kterou chceme udělat, je provést kontrolu skriptu, aby se ujistil, že vše, co potřebuje, je na místě. Chcete-li to udělat, musíme začít tím, že řekne, kde hledat a co hledat.

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

    První řádek je velmi užitečný pro všechny skripty. Definuje proměnnou, která ukazuje na složku obsahující skript. To je nezbytné, pokud váš skript potřebuje jiné soubory, které jsou umístěny ve stejném adresáři jako sám o sobě (nebo známá relativní cesta z tohoto adresáře), protože jinak se vyskytnou chyby, když a když se pokusíte spustit skript, když jste v jiném pracovní adresář.

    Druhý řádek vytvoří pole názvů souborů, které jsou nutné pro správný chod skriptu. Použijeme to spolu s proměnnou $ ScriptFolder v dalším dílu, kde kontrolujeme, zda jsou tyto soubory přítomné.

    $ RequiredFiles | ForEach-Object if (! (Test-Cesta "$ ScriptFolder \ $ _")) Záznam-Host "$ _ nebyl nalezen." -ForegroundColor červená $ MissingFiles ++

    Tato část skriptu odešle pole $ RequiredFiles do bloku ForEach-Object. V rámci tohoto bloku skriptů použije příkaz if v testovací cestě, zda soubor, který hledáme, místo, kam patří. Testovací cesta je jednoduchý příkaz, který při zadání cesty k souboru vrátí základní pravdivou nebo falešnou odpověď, aby nám řekl, zda cesta ukazuje na něco, co existuje. Vykřičník tam je a ne operátor, který před odevzdáním příkazu if vrací odpověď testovací cesty. Takže pokud testovací cesta vrátí falešný (tedy soubor, který hledáme, neexistuje), bude konvertován na true tak, že příkaz if bude spouštět svůj blok skriptu.

    Další věc, kterou je třeba si uvědomit zde, která bude často použita v tomto skriptu, je použití dvojitých uvozovek namísto jednočinných uvozovek. Když položíte něco v jednoduchých uvozovkách, PowerShell ji zachází jako statický řetězec. Cokoliv je v jednotlivých citacích bude předáno přesně tak, jak je. Dvojitá uvozovka říká, že PowerShell předává proměnné a některé další speciální položky uvnitř řetězce, než je předá. Tady dvojité uvozovky znamenají, že místo běhu Testovací cesta '$ ScriptFolder \ $ _'  budeme vlastně dělat něco podobného Testovací cesta "C: \ Scripts \ Surnames.txt" (za předpokladu, že váš skript je v C: \ Scripts a ForEach-Object aktuálně pracuje na 'Surnames.txt').

    U každého souboru, který nenalezl, zapíše zpráva Host-Host chybové hlášení červené, které vám řekne, který soubor chybí. Poté se zvýší proměnná $ MissingFiles, která bude použita v dalším dílu, chyba a ukončete, pokud chybí nějaké soubory.

    pokud ($ MissingFiles) Write-Host "Nelze najít zdrojový soubor $ MissingFiles. -ForegroundColor Červená odstranit-Variabilní ScriptFolder, RequiredFiles, MissingFiles Exit

    Zde je další čistý trik, který můžete udělat s výroky. Většina průvodců uvidíte o tom, zda příkazy vám řeknou, abyste používali operátora ke kontrole odpovídajícího stavu. Například zde bychom mohli využít pokud ($ MissingFiles -gt 0) zda $ MissingFiles je větší než nula. Pokud však již používáte příkazy, které vrátí hodnotu booleovské hodnoty (jako v předchozím bloku, kde jsme používali testovací cestu), není to nutné. V takových situacích můžete také bez toho udělat, když právě testujete, zda není číslo nenulové. Každé nenulové číslo (kladné nebo záporné) se považuje za pravdivé, zatímco nula (nebo, jak se zde může stát, neexistující proměnná) bude považována za nepravdivou.

    Pokud existuje soubor $ MissingFiles a je nenulový, program Write-Host uveřejní zprávu, která vám ukáže, kolik souborů chybí a že skript přeruší. Poté Remove-Variable vyčistí všechny proměnné, které jsme vytvořili a Exit ukončí skript. Na pravidelné konzoli PowerShell není pro tento účel skutečně potřeba odstranit proměnnou, protože proměnné nastavené skripty se při ukončení skriptu obvykle vyřadí. Ovšem PowerShell ISE se chová trochu jinak, takže byste si to mohli nechat, pokud máte v plánu spustit skript odtud.

    Pokud je vše v pořádku, skript bude pokračovat. Ještě jedna další příprava je alias, že budeme opravdu rádi, že budeme mít později.

    Nový alias g Get-Random

    Aliasy se používají k vytvoření alternativních jmen příkazů. Ty mohou být užitečné, abychom nám pomohli seznámit se s novým rozhraním (např .: PowerShell má vestavěné aliasy jako dir -> Get-ChildItem a cat -> Get-Content) nebo krátkodobé odkazy na běžně používané příkazy. Tady děláme velmi krátký odkaz pro Get-Random který bude hodně později používán.

    Get-Random docela dělá to, co naznačuje jeho jméno. Vzhledem k tomu, že jako vstupní pole (jako seznam jmen) je vybrána náhodná položka z pole a spiknutí. Může se také použít k generování náhodných čísel. Věc, kterou si vzpomínáte na Get-Random a čísla, je, že stejně jako mnoho jiných počítačových operací začne počítat od nuly. Takže namísto Get-Random 10 což znamená mnohem přirozenější "dejte mi číslo od 1 do 10" to opravdu znamená "dejte mi číslo od 0 do 9." Můžete být konkrétnější o výběru čísla, takže Get-Random se chová více, jako byste přirozeně očekáváme, ale v tomto scénáři to nepotřebujeme.

    Část 2: Získání uživatelského vstupu a práce do práce

    Zatímco skript, který generuje jen jedno náhodné jméno a telefonní číslo, je skvělý, je mnohem lepší, pokud skript dovolí uživateli určit, kolik jména a čísel chce dostat v jedné dávce. Bohužel, nemůžeme opravdu důvěřovat uživatelům, aby vždy dali platný vstup. Takže je o něco drobnější než jenom $ UserInput = Read-Host.

    zatímco (! $ ValidInput) try [int] $ UserInput = Číst-Host -Prompt 'položky, které mají být generovány' $ ValidInput = $ true catch Write-Host 'Neplatný vstup. Zadejte pouze číslo. " -Předoblíbené barevné červené barvy

    Zatímco výše uvedené prohlášení zkontroluje a popírá hodnotu $ ValidInput. Dokud $ ValidInput je falešný nebo neexistuje, bude pokračovat ve smyčce skrze svůj blok skriptu.

    Příkaz try vyberá uživatelský vstup přes Read-Host a pokusí se jej převést na celočíselnou hodnotu. (To je [int] před Read-Host.) Pokud je úspěšný, nastaví hodnotu $ ValidInput na true tak, aby cykly while could exit. Pokud není úspěšný, blok chyby uloží chybu a protože hodnota $ ValidInput nebyla nastavena, cyklus while se vrátí zpět a znovu vyzve uživatele.

    Jakmile uživatel řádně zadá číslo jako vstup, chceme, aby skript oznámil, že se chystá skutečně začít pracovat a pak se o tom.

    Write-Host "'nProdukce $ UserInput jména a telefonní čísla. Prosím, buďte trpěliví.'n" 1 ... $ UserInput | ForEach-Object 

    Nebojte se, nechceme vás opustit, abyste zjistili kód generátorů náhodných jmen a čísel. To je jen poznámka typu placeholder, která vám ukáže, kde se bude hodit další část (kde se skutečná práce dělá).

    Řada Write-Host je docela jednoduchá. Jednoduše říká, kolik jména a telefonních čísel bude skript generovat, a žádá uživatele, aby byl trpělivý, zatímco skript pracuje. The'n na začátku a na konci řetězce je vložen prázdný řádek před a za tímto výstupem, jen aby se dal nějaký vizuální odstup mezi vstupní čárou a seznamem jmen a čísel. Uvědomte si, že to je back-tick (AKA "hluboký přízvuk" - obvykle klíč nad tabulkou, vlevo od 1) a ne apostrof nebo single-quote před každým n.

    Následující část ukazuje jiný způsob, jak můžete použít smyčku ForEach-Object. Typicky, když chcete, aby blok skriptu běžel určitý počet časů, nastavíte pravidelné smyčky pro ($ x = 1; $ x -le $ UserInput; $ x ++) . Objekt ForEach nám umožňuje zjednodušit to tím, že mu přikládáme seznam celých čísel a namísto toho, abychom mu řekli, že skutečně dělá cokoli s těmito celistvami, dáme mu pouze statický skriptový blok, který běží, dokud nevyjde z celých čísel, aby to udělal.

    Část 3: Generování náhodného jména

    Generování názvu je nejjednodušší bit zbytku tohoto procesu. Skládá se pouze ze tří kroků: Výběr příjmení, vybírání pohlaví a vybírání křestního jména. Pamatuj si, že alias jsme udělali pro Get-Random chvíli zpátky? Je čas začít používat to.

        $ Příjmení = Získat obsah "$ ScriptFolder \ Surnames.txt" g $ Muž = g 2 pokud ($ Muž) $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" | g jiný $ FirstName = Get-Content "$ ScriptFolder \ Females.txt" G

    První řádek přebírá náš příjmení, přenese jej do náhodného výběru a přidělí vybrané jméno uživateli $ Příjmení.

    Druhý řádek vybírá pohlaví naší osoby. Zapamatujte si, jak začne Get-Random počítat od nuly a jak je nula falešná a všechno ostatní je pravdivé? Tak používáme Get-Random 2 (nebo mnohem kratší g 2 díky našemu aliasu - oba vedou k volbě mezi nulou nebo jednou), abychom rozhodli, zda je naše osoba mužem nebo ne. Příkaz if / else následně náhodně zvolí jméno nebo ženu.

    Část 4: Generování náhodného telefonního čísla

    Zde je opravdu zábavná část. Dříve jsme vám ukázali, jak existuje několik způsobů, jak můžete vytvořit neplatné nebo fiktivní telefonní číslo. Vzhledem k tomu, že nechceme, aby všechny naše čísla vypadaly příliš podobně, budeme náhodně vybrat neplatný formát čísel pokaždé. Náhodně vybrané formáty budou definovány jejich kódem oblasti a kódem Exchange, který bude společně uložen jako předpona $.

        $ NumberFormat = g 5 přepínač ($ NumberFormat) 0 $ Prefix = "($ (g 2) $ (g 10) $ (g 10)  1 $ Prefix = "($ (g 10) 9 $ (g 10)) $ (g 10) $ (g 10) $ (g 10) (g 10) $ (g 2) $ (g 2) $ (g 10) $ (g 10) " 3 $ Prefix =" $ (g 10) 11 " 4 $ Prefix =" ($ (g 10) $ (g 10) $ (g 10)

    První řádek je jednoduchá generace náhodných čísel, která vybere formát, který budeme sledovat pro telefonní číslo. Následně příkaz příkazu přebírá tuto náhodnou volbu a podle toho generuje předponu $. Pamatujte na seznam neplatných typů telefonních čísel? Hodnoty $ NumberFormat 0-3 odpovídají prvním čtyřům v tomto seznamu. Hodnota 4 může vygenerovat jednu z posledních dvou, protože obě používají Exchange Code "555".

    Zde můžete také vidět, že používáme další trik s dvojitými uvozovkami. Dvojité uvozovky neumožňují pouze interpretovat proměnné před výstupním řetězcem - umožňují také zpracování skriptových bloků. Chcete-li to provést, zabalte blok skriptu takto: "$ ()". Takže to, co máte nahoře, je spousta individuálně randomizovaných číslic, přičemž některé z nich jsou buď omezené nebo jsou staticky nastaveny podle pravidel, která musíme dodržovat. Každý řetězec má také závorku a mezery, jak byste normálně očekávali v oblasti kódu a dvojice kódových kódů.

    Poslední věc, kterou musíme udělat předtím, než budeme připraveni vysílat své jméno a telefonní číslo, je vytvořit ID účastníka, který bude uložen jako přípona $.

        ($ 10) $ ($ 10) " 4 přepínač ($ Prefix) '(($) 800) 555 '$ Suffix =' 0199 ' výchozí $ Suffix = "01 $ (g 10) $ (g 10)"

    Kvůli zvláštním pravidlům pro 555 čísel nemůžeme vygenerovat čtyři náhodné číslice na konec každého telefonního čísla, které náš skript udělá. První přepínač tedy zkontroluje, zda se jedná o číslo 555. Pokud ne, generuje čtyři náhodné číslice. Je-li číslem 555, druhý přepínač zkontroluje 800zónový kód. Pokud se to shoduje, existuje pouze jeden platný příplatek $, který můžeme použít. V opačném případě je dovoleno vybrat si z čehokoliv od 0100-0199.

    Všimněte si, že existuje několik různých způsobů, jak tento blok mohl být napsán namísto toho, jak je. Obě příkazy přepínačů mohly být nahrazeny příkazy if / else, protože každý z nich zpracovává pouze dvě možnosti. Také namísto konkrétního volání "4" jako volby pro první příkaz přepínač, "výchozí" by mohlo být použito podobně jako to bylo děláno v druhé, protože to byla jediná možnost vlevo. Volba mezi symbolem if / else vs. přepínačem nebo kde použít výchozí klíčové slovo namísto konkrétních hodnot se často blíží otázce osobních preferencí. Dokud to funguje, použijte, co vám nejvíce vyhovuje.

    Nyní je čas na výstup.

        Výstup zápisu "$ FirstName $ Příjmení $ Prefix- $ Suffix"

    Tohle je skoro stejně jednoduché, jak se ve scénáři dostává. Zobrazuje pouze jméno a příjmení oddělené mezerami a pak další místo před telefonním číslem. Zde je místo, kde se přidává standardní pomlčka mezi kódem Exchange a ID předplatitele.

    Uzavírací závěs ve spodní části je konec smyčky ForEach-Object z předchozího - vynechat to, pokud jste ji již získali.

    Část 5: Vyčištění a spuštění skriptu

    Po dokončení všech prací je dobrý skript schopen sám sebe vyčistit. Opět platí, že proměnné odstranění níže není skutečně zapotřebí, pokud chcete spustit skript z konzoly, ale budete chtít, pokud plánujete spustit v ISE.

    Odebrat-alias položky: \ g Odstranit-variabilní soubor skriptu, RequiredFiles, Příjmení, Muž, FirstName, NumberFormat, Prefix, Suffix, ValidInput, UserInput

    Po dokončení všech kroků uložte skript s příponou ".ps1" ve stejné složce jako vaše soubory jmen. Ujistěte se, že vaše ExecutionPolicy je nastavena tak, aby skript mohl běžet a dát jej víru.

    Zde je screenshot skriptu v akci:

    Můžete také stáhnout soubor ZIP obsahující tento skript PowerShell a textové soubory se seznamy jmen z níže uvedeného odkazu.

    Generátor náhodných jmen a telefonních čísel pro PowerShell