10Sep
Když potřebujete datovou sadu pro testování nebo demonstraci a tato množina musí reprezentovat osobní identifikační údaje( PII), obecně nechcete používat skutečná data, která představuje skutečné lidi. Zde vás budeme procházet tím, jak můžete použít PowerShell pro generování seznamu náhodných jmen a telefonních čísel pro právě takovou příležitost.
Co potřebujete
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í PowerShell 4.0 a také byl testován na kompatibilitu s PowerShell 2.0.PowerShell 2.0 nebo vyšší byl vestavěn do Windows 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 na 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 na platformě 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 do této aktualizace upgradovat jako součást aktualizace WMF ze služby Stažení softwaru společnosti Microsoft. Není k dispozici pro XP ani Vista. Názvy
Budete potřebovat nějaké seznamy názvů, které chcete přenést do náhodného generátoru. Skvělý zdroj pro 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 je 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 / pár trval přibližně 1,5 sekundy, aby se vygeneroval pomocí úplných seznamů, ale počet vašich kilometrů se bude lišit v závislosti na vašich vlastních specifikacích systému.
- Příjmení
- Mužská první jména
- První jmenovaná žena
Bez ohledu na zdroj, který používáte, budete muset vygenerovat tři textové soubory, které skript může používat jako fondy pro výběr jeho jména. 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 BrownMales.txt by měl obsahovat jména, z nichž chcete vybrat skript. Příklad:
James John Robert Michaela WilliamFemales.txt by měla obsahovat křestní jména, od kterých chcete vybrat skript. Příklad:
Mary Patricia Linda Barbara ElizabethPravidla pro telefonní čísla
Pokud chcete mít jistotu, že vaše telefonní čísla neodpovídají skutečnému telefonnímu číslu někoho, nejjednodušší je použít známý "555" Exchange Code. Ale pokud chcete zobrazit datovou sadu s mnoha telefonními čísly, začne 555 vypadat docela monotónně.Chcete-li věci zajímavější, vygenerujeme další telefonní čísla, která porušují pravidla NANP( North American Numbering Plan).Níže jsou některé ukázky 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čínat 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 Exchange kódy nemohou začít s 1 nebo 0. - ( 752) 811-1375
Toto číslo je neplatné, protože Exchange kódy nemohou skončit dvěma 1s. - ( 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 pouze 800 číslo s 555 Exchange kód, který je vyhrazen pro použití jako fiktivní číslo.
Všimněte si, že výše uvedená pravidla mohou být změněna a mohou se lišit podle jurisdikce. Měli byste provést vlastní výzkum, abyste ověřili stávající 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 bloku skriptů ForEach-Object se proměnná $ _ používá k odkazu na aktuální zpracovávanou položku.
- pokud. .. else příkazy umožňují provádět operaci pouze v případě, že jsou splněny určité podmínky, a( volitelně) specifikujte, co by mělo být provedeno, pokud není splněna tato podmínka.
- přepínače příkazy jsou jako příkazy s více volbami. Přepínač zkontroluje objekt proti několika podmínkám a spustí libovolné bloky skriptů, které jsou určeny 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 pro přepnutí také používají proměnnou $ _, aby se odkazovaly na aktuální zpracovávanou 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.
- zkuste. .. catch příkazy pomoc s manipulací s chybami. Pokud se něco děje s blokem skriptu specifikovaným pro vyzkoušení, zablokuje se blok chyby.
- Get-Content dělá to, co říká na plechovce. Získává obsah určeného objektu - obvykle souboru. Toto může být použito k zobrazení obsahu textového souboru na konzole nebo, stejně jako v tomto skriptu, předat obsah podél potrubí, které se použije s dalšími příkazy.
- Správa hostitele 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. Záznamový výstup
- 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.
V skriptu existují další příkazy, ale vysvětlíme jim, jak jdeme.
Vytváření skriptu
Nyní je čas dostat naše špinavé ruce.
Část 1: Připravte se na cestu
Pokud chcete, aby váš skript začal běžet z čisté konzoly, je zde první řádek, který chcete v ní.
Clear-HostNyní, když máme čistou obrazovku, další věc, kterou chceme udělat, je provést kontrolu skriptu, aby bylo zajištěno, ž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-Path $ MyInvocation. MyCommand. Definition -Parent $ RequiredFiles =( 'Males.txt', 'Females.txt', 'Surnames.txt')První řádek je velmi užitečný pro libovolný skript. 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, pokud a když se pokusíte spustit skript, když jste v jinémpracovní 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řítomny.
$ RequiredFilesForEach-Object{ if( !( Test-Cesta "$ ScriptFolder \ $ _")){ Záznam-Host "$ _ nebyl nalezen."-ForegroundColor červená $ MissingFiles ++}}Tento kus skriptu odešle pole $ RequiredFiles do bloku ForEach-Object. V rámci tohoto bloku skriptu příkaz if používá testovací cestu, zda soubor, který hledáme, je 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ěď, která nám říká, zda cesta ukazuje na něco, co existuje. Vykřičník tam je operátor , nikoliv , který změní odpověď testovací cesty předtím, než ji předá příkazu if. 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 provede spuštění bloku 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. Vše, co je v jednotlivých citacích, bude předáno přesně tak, jak je. Dvojitá uvozovky říká PowerShell, aby přeložil proměnné a některé další speciální položky do řetězce, než je předá.Tady dvojité uvozovky znamenají, že namísto spuštění Test-Path '$ ScriptFolder \ $ _' budeme vlastně dělat něco podobného Test-Path 'C: \ Scripts \ Surnames.txt' skript je v C: \ Scripts a ForEach-Object aktuálně pracuje na 'Surnames.txt').
Pro každý soubor, který nenalezl, zapíše Write-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é soubory $ MissingFiles. Přerušení skriptu."-ForegroundColor Červená Odstranit-Proměnná ScriptFolder, RequiredFiles, MissingFiles Ukončit}Zde je další úhledný trik, můžete-li s výroky. Většina průvodců uvidíte o tom, zda příkazy vám řeknou použít operátora ke kontrole shodného stavu. Například zde bychom mohli použít , pokud( $ MissingFiles -gt 0) zjistí, zda $ MissingFiles je větší než nula. Pokud však již používáte příkazy, které vrátí booleovskou hodnotu( jako v předchozím bloku, kde jsme používali testovací cestu), není to nutné.V takových situacích můžete také bez problémů udělat, když právě testujete, zda je číslo nenulové.Jakékoliv 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 falešnou.
Pokud existuje soubor $ MissingFiles a je nenulový, program Write-Host uveřejní zprávu, která vám sdělí, kolik souborů chybí a že skript přeruší.Pak Remove-Variable vyčistí všechny proměnné, které jsme vytvořili, a Exit ukončí skript. Na řádné 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 to chtěli nechat, pokud máte v plánu spustit skript.
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é aliasy g Získané-náhodnéAliasy se používají k vytvoření alternativních jmen pro příkazy. Mohou to být užitečné pro to, abychom se seznámili s novým rozhraním( například: PowerShell má vestavěné aliasy jako dir - & gt; Get-ChildItem a cat - & gt; Get-Content ) nebo krátkodobé odkazypro běžně používané příkazy. Zde děláme velmi krátkou referenci pro příkaz Get-Random , který se hodně hodí později.
Get-Random docela dělá to, co naznačuje jeho název. Při zadání pole( jako seznam názvů) jako vstupu vybere náhodnou položku z pole a vyplivne ji. 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 dalších počítačových operací se začíná počítat od nuly. Takže namísto Get-Random 10 znamená 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á spíše jako, co byste přirozeně očekávali, ale v tomto scénáři to nepotřebujeme.
Část 2: Získávání uživatelského vstupu a nasazení do práce
Zatímco skript, který generuje jen jedno náhodné jméno &telefonní číslo je skvělé, je mnohem lepší, pokud skript dovolí uživateli určit, kolik jména &čísla, která se chtějí dostat do jedné dávky. Bohužel, nemůžeme opravdu důvěřovat uživatelům, aby vždy dali platný vstup. Takže je tu něco drobnější než jen $ UserInput = Read-Host .
při( $ $ ValidInput){ try{ [int] $ UserInput = Položky Read-Host -Prompt, které mají být generovány '$ ValidInput = $ true} catch{ Write-Host' Neplatný vstup. Zadejte pouze číslo. "-ForegroundColor Red}}Výše uvedené příkazy while kontroluje a odmítá hodnotu $ ValidInput. Dokud $ ValidInput je falešný nebo neexistuje, bude pokračovat ve smyčce skrze svůj blok skriptu.
Příkaz try získá uživatelský vstup pomocí programu Read-Host a pokusí se jej převést na celočíselnou hodnotu.(To je [int] před Read-Host.) Pokud je to úspěšné, nastaví hodnotu $ ValidInput na hodnotu true tak, aby smyčka while mohla opustit. 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.
Poté, co uživatel řádně zadal číslo jako vstup, chceme, aby skript oznámil, že se chystá skutečně začít pracovat a pak se to dělá.
Write-Host "` nProdukce $ UserInput jména a telefonních čísel. Prosím, buďte trpěliví.`n "1. . $ UserInput |ForEach-Object{ & lt; # INSERT RANDOM NAME &ČÍSELOVÝ GENERÁTOR ZDE # & gt;}Nebojte se, nechceme vás opustit, abyste zjistili náhodné jméno &kód generátoru čísel. To je jen komentář zástupného symbolu, 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 skript generuje, a žádá uživatele, aby byl trpělivý, zatímco skript pracuje. `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 mu dal nějaké vizuální oddělení mezi vstupní čárou a seznamem jmen a &čísla. Uvědomte si, že to je back-tick( AKA "hluboký přízvuk" - obvykle klíč nad tabulkou, vlevo od 1) a nikoli apostrof nebo jednočinný 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 smyčku jako pro( $ x = 1; $ x -le $ UserInput; $ x ++){ & lt; # INSERT SCRIPTZDE # & gt;}.Objekt ForEach nám dovoluje zjednodušit to tak, že mu podá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 se nezbaví celých čísel.
Čá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. Pamatujte si, že alias jsme udělali pro Get-Random chvíli zpátky? Je čas na to, aby to začalo používat.
$ Příjmení = Získat obsah "$ ScriptFolder \ Surnames.txt" |g $ Muž = g 2 pokud( $ Muž){ $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" |g} jiný{ $ FirstName = Získat obsah "$ ScriptFolder \ Females.txt" |g}První řádek přebírá seznam 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é?To je způsob, jakým používáme Get-Random 2 ( nebo mnohem kratší g 2 díky aliasu - oba mají za následek výběr mezi nulou nebo jednou), abychom rozhodli, zda je naše osoba mužská nebo ne. Příkaz if / else následně náhodně zvolí křestní 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, že existuje několik způsobů, jak můžete vytvořit neplatné nebo fiktivní telefonní číslo. Vzhledem k tomu, že nechceme, aby všechna naše čísla vypadala 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 $.(G 10)) $( g 10) $( g 10) $( g 10) $( g 10)"} ${ (G 10) 9 $( g 10)) $( g 10) $( g 10) $( g 10)$( g 10) $( g 10)) $( g 2) $( g 10) $( g 10) "} 3{ $ Prefix =) $( g 10) 11 "} 4{ $ Prefix ="( $( g 10) $( g 10) $( g 10) 555 "}
První řádek je přímá generace náhodných číselbudeme sledovat telefonní číslo. Následně příkaz příkazu přepne tuto náhodnou volbu a podle toho vytvoří 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 také vidíte, ž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ávat bloky skriptů.Chcete-li to provést, zabalte blok skriptu takto: "$( & lt; # SCRIPT HERE # & gt;)" .Takže to, co máte nahoře, je spousta individuálně randomizovaných čísel, přičemž některé z nich jsou buď omezené ve svém rozsahu nebo staticky stavěny 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 vytisknout naše jméno &telefonní číslo je generovat ID předplatitele, které budou uloženy jako přípona $ Suffix. Přepínač
( $ NumberFormat){ {$ _ -lt 4}{ $ Suffix = "$( g 10) $( g 10) $( g 10)(800) 555 '{$ Suffix =' 0199 '} výchozí{ $ Suffix = "01 $( g 10) $( g 10)"}}}}Z důvodu zvláštních pravidel pro 555 číselgenerovat čtyři náhodné číslice pro konec každého telefonního čísla, které náš skript udělá.Takže první přepínač kontroluje, jestli máme číslo 555.Pokud ne, generuje čtyři náhodné číslice. Je-li číslem 555, druhý přepínač kontroluje 800zónový kód. Pokud se to shoduje, existuje pouze jeden platný $ Suffix, 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 napsat, místo toho, jak je. Obě příkazy přepínačů mohly být nahrazeny příkazy if / else, jelikož 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í" mohl být použit podobný jak to bylo děláno v druhé, protože to byla jediná volba. 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í preference. Dokud to funguje, použijte to, s čím se nejvíce chcete.
Nyní je čas na výstup.
Výstupní zápis "$ FirstName $ Příjmení $ Prefix- $ Suffix"}Toto je téměř stejně jednoduché, jak se ve scénáři dostává.Zobrazí se pouze jméno a příjmení oddělené mezerami, 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.
Tato uzávěrka ve spodní části je konec smyčky ForEach-Object od dříve - vynechat to, pokud ji už máte.
část 5: Vyčištění a spuštění skriptu
Po dokončení práce je dobrý skript schopen sám vyčistit. Opět platí, že odstranění proměnné níže není skutečně zapotřebí, pokud chcete spouštět skript z konzoly, ale budete ji chtít, pokud ji někdy plánujete spustit v ISE.
Odstranit alias položky: \ g Odstranit-variabilní ScriptFolder, RequiredFiles, Příjmení, Muž, FirstName, NumberFormat, Prefix, Suffix, ValidInput, UserInputPo dokončení skript uložte příponu ".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 ZIP soubor obsahující tento skript PowerShell a textové soubory se seznamy jmen z níže uvedeného odkazu.
Náhodné jméno &Generátor telefonních čísel pro PowerShell