If-Koubou

Jak generować losowe nazwy i numery telefonów za pomocą PowerShell

Jak generować losowe nazwy i numery telefonów za pomocą PowerShell (Jak)

Kiedy potrzebujesz zestawu danych do testowania lub demonstracji, a ten zestaw musi reprezentować dane osobowe (PII), zazwyczaj nie chcesz używać rzeczywistych danych reprezentujących rzeczywistych ludzi. Poniżej przedstawiamy, w jaki sposób można używać PowerShell do generowania listy losowych nazw i numerów telefonów na taką okazję.

Czego potrzebujesz

Zanim zaczniesz, musisz mieć kilka narzędzi i informacji:

PowerShell

Ten skrypt został opracowany przy użyciu PowerShell 4.0, a także został przetestowany pod kątem zgodności z PowerShell 2.0. PowerShell 2.0 lub nowszy jest wbudowany w system Windows od wersji Windows 7. Jest również dostępny dla systemów Windows XP i Vista jako część Windows Management Framework (WMF). Niektóre dalsze szczegóły i linki do pobrania znajdują się poniżej.

  • PowerShell 2.0 jest dostarczany z Windows 7. Użytkownicy Windows XP SP3 i Vista (SP1 lub nowszy) mogą pobrać odpowiednią wersję WMF od Microsoft w KB968929. Nie jest obsługiwany w XP SP2 lub poniżej, ani Vista bez dodatku SP1.
  • PowerShell 4.0 jest dostarczany z systemem Windows 8.1. Użytkownicy Windows 7 SP1 mogą go uaktualnić w ramach aktualizacji WMF z Centrum pobierania Microsoft. Nie jest dostępny dla XP lub Vista.

Nazwy

Będziesz potrzebował list nazw, które będą podawane do generatora losowego. Doskonałe źródło los nazwisk i informacji dotyczących ich popularności (choć nie będzie to wykorzystywane w tym skrypcie), jest United States Census Bureau. Listy dostępne pod poniższymi linkami są bardzo duże, więc możesz chcieć je nieco przyciąć, jeśli planujesz generować wiele nazw i numerów jednocześnie. W naszym systemie testowym każda para nazwa / numer zajęła około 1,5 sekundy, aby wygenerować przy użyciu pełnych list, ale Twój przebieg będzie się różnić w zależności od własnych specyfikacji systemu.

  • Nazwiska
  • Male First Names
  • Kobiece pierwsze imiona

Bez względu na to, z jakiego źródła korzystasz, będziesz musiał wygenerować trzy pliki tekstowe, które skrypt może wykorzystać jako pule do wyboru nazwy. Każdy plik powinien zawierać tylko nazwy i tylko jedną nazwę w każdym wierszu. Te muszą być przechowywane w tym samym folderze co twój skrypt PowerShell.

Nazwiska.txt powinien zawierać nazwiska, z których skrypt ma wybierać. Przykład:

Smith Johnson Williams Jones Brown

Males.txt powinien zawierać męskie imiona, z których skrypt ma wybierać. Przykład:

James John Robert Michael William

Females.txt powinien zawierać żeńskie imiona, z których skrypt ma wybierać. Przykład:

Mary Patricia Linda Barbara Elizabeth

Zasady numerów telefonów

Jeśli chcesz mieć pewność, że Twoje numery telefonów nie odpowiadają rzeczywistemu numerowi telefonu, najprostszym sposobem jest użycie dobrze znanego kodu wymiany "555". Ale jeśli zamierzasz wyświetlać zestaw danych z dużą liczbą numerów telefonów, to 555 zacznie wyglądać dość monotonnie szybko. Aby było ciekawiej, wygenerujemy inne numery telefonów, które naruszają zasady NANP (North American Planing Number). Poniżej znajduje się przykład nieprawidłowych numerów telefonów, reprezentujących każdą klasę liczb, która zostanie wygenerowana przez ten skrypt:

  • (157) 836-8167
    Ta liczba jest nieprawidłowa, ponieważ Kody Obszarów nie mogą zaczynać się od 1 lub 0.
  • (298) 731-6185
    Ta liczba jest nieważna, ponieważ NANP nie przypisuje kodów obszaru z 9 jako drugą cyfrą.
  • (678) 035-7598
    Ten numer jest nieprawidłowy, ponieważ Kody wymiany nie mogą zaczynać się od 1 lub 0.
  • (752) 811-1375
    Ta liczba jest nieprawidłowa, ponieważ Kody wymiany nie mogą kończyć się dwoma 1s.
  • (265) 555-0128
    Ten numer jest nieprawidłowy, ponieważ kod wymiany to 555, i identyfikator subskrybenta mieści się w zakresie zarezerwowanym dla fikcyjnych numerów.
  • (800) 555-0199
    Ten numer jest jedynym numerem 800 z kodem wymiany 555, który jest zarezerwowany do użycia jako fikcyjny numer.

Należy pamiętać, że powyższe zasady mogą ulec zmianie i mogą się różnić w zależności od jurysdykcji. Powinieneś przeprowadzić własne badania, aby zweryfikować aktualne reguły obowiązujące w miejscu, w którym będziesz generować numery telefonów.

Wspólne polecenia

Istnieje kilka dość powszechnych poleceń, które będą używane w tym skrypcie, więc powinieneś się zorientować, co to znaczy, zanim zanurkujemy w pisanie.

  • ForEach-Object pobiera tablicę lub listę obiektów i wykonuje określoną operację na każdym z nich. W bloku skryptu ForEach-Object zmienna $ _ jest używana do odniesienia do aktualnie przetwarzanego elementu.
  • Jeśli inaczej instrukcje pozwalają wykonać operację tylko wtedy, gdy spełnione są określone warunki i (opcjonalnie) określają, co należy zrobić, gdy ten warunek nie jest spełniony.
  • przełącznik Wyrażenia są jak w przypadku instrukcji z większymi możliwościami wyboru. Przełącznik sprawdzi obiekt pod kątem kilku warunków i uruchomi wszystkie bloki skryptu określone dla warunków, które obiekt pasuje. Można również opcjonalnie określić blok domyślny, który będzie uruchamiany tylko wtedy, gdy nie zostaną spełnione żadne inne warunki. Instrukcje switch również używają zmiennej $ _, aby odnieść się do aktualnie przetwarzanego elementu.
  • podczas instrukcje pozwalają na ciągłe powtarzanie bloku skryptu, o ile spełniony jest określony warunek. Gdy zdarzy się coś, co spowoduje, że warunek przestanie być prawdziwy, gdy blok skryptu zostanie zakończony, pętla zostanie zamknięta.
  • próbuj złapać instrukcje pomagają w obsłudze błędów. Jeśli coś pójdzie nie tak z blokiem skryptu określonym dla try, blok catch będzie działał.
  • Pobierz zawartość robi to, co mówi na puszce. Otrzymuje zawartość określonego obiektu - zwykle jest to plik. Może to być używane do wyświetlania zawartości pliku tekstowego w konsoli lub, jak w tym skrypcie, przekazywać zawartość wzdłuż potoku do użycia z innymi poleceniami.
  • Write-Host umieszcza rzeczy w konsoli.Służy do prezentowania wiadomości użytkownikowi i nie jest uwzględnione w wyjściu skryptu, jeśli dane wyjściowe zostaną przekierowane.
  • Write-Output faktycznie generuje wynik. Zwykle jest to zrzucane na konsolę, ale może być również przekierowane przez inne polecenia.

W skrypcie są inne polecenia, ale wyjaśnimy je w trakcie.

Budowanie skryptu

Teraz czas na brudne ręce.

Część 1: Przygotowanie do podróży

Jeśli chcesz, aby twój skrypt uruchamiał się z czystej konsoli, oto pierwsza linia, w której chcesz.

Wyczyść hosta

Teraz, gdy mamy czysty ekran, następną rzeczą, którą chcemy zrobić, jest sprawdzenie skryptu, aby upewnić się, że wszystko, czego potrzebuje, jest na miejscu. Aby to zrobić, musimy zacząć od powiedzenia mu, gdzie szukać, i czego szukać.

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

Pierwsza linia jest bardzo przydatna dla każdego skryptu. Definiuje zmienną wskazującą folder zawierający skrypt. Jest to niezbędne, jeśli twój skrypt potrzebuje innych plików, które znajdują się w tym samym katalogu, co on (lub znanej ścieżce względnej z tego katalogu), ponieważ w przeciwnym razie napotkasz błędy, jeśli spróbujesz uruchomić skrypt, gdy jesteś w innym katalog roboczy.

Druga linia tworzy tablicę nazw plików wymaganych do prawidłowego działania skryptu. Użyjemy tego razem ze zmienną $ ScriptFolder w kolejnym utworze, w którym sprawdzamy, czy pliki te są obecne.

$ RequiredFiles | ForEach-Object if (! (Test-Path "$ ScriptFolder \ $ _")) Write-Host "Nie znaleziono $ _." -ForegroundColor Red $ MissingFiles ++

Ten fragment skryptu wysyła tablicę $ RequiredFiles do bloku ForEach-Object. W obrębie tego bloku skryptu instrukcja if używa ścieżki testowej, aby sprawdzić, czy plik, którego szukamy, znajduje się w miejscu, do którego należy. Test-Path to proste polecenie, które po podaniu ścieżki pliku zwraca podstawową odpowiedź prawdziwą lub fałszywą, aby poinformować nas, czy ścieżka wskazuje na coś, co istnieje. W tym miejscu znajduje się wykrzyknik nie operator, który odwraca odpowiedź testowej ścieżki przed przekazaniem jej do instrukcji if. Jeśli więc Ścieżka testowa zwróci wartość false (tzn. Plik, którego szukamy nie istnieje), zostanie przekonwertowany na wartość true, dzięki czemu instrukcja if wykona swój blok skryptu.

Inną rzeczą, o której należy pamiętać, która będzie często używana w tym skrypcie, jest użycie podwójnych cudzysłowów zamiast pojedynczych cudzysłowów. Gdy umieścisz coś w cudzysłowach, PowerShell traktuje go jako ciąg statyczny. Cokolwiek znajduje się w pojedynczym cudzysłowie, będzie przekazywane dokładnie tak, jak jest. Podwójne cytaty nakazują PowerShellowi przetłumaczyć zmienne i kilka innych specjalnych elementów w ciągu znaków przed ich przekazaniem. Tutaj podwójne cudzysłowy oznaczają, że zamiast biegać Ścieżka testowa '$ ScriptFolder \ $ _' będziemy robić coś bardziej podobnego Ścieżka testowa "C: \ Skrypty \ Nazwiska.txt" (zakładając, że twój skrypt znajduje się w C: \ Scripts, a ForEach-Object pracuje obecnie nad "Nazwiskiem.txt").

W przypadku nie znalezienia każdego pliku Write-Host wyświetli komunikat o błędzie na czerwono, informujący o tym, którego pliku brakuje. Następnie zwiększa wartość zmiennej $ MissingFiles, która będzie używana w następnym utworze, do błędu i zakończy pracę, jeśli brakowało plików.

if ($ MissingFiles) Write-Host "Nie można znaleźć plików źródłowych $ MissingFiles. Przerwanie skryptu." -ForegroundColor Red Remove-Variable ScriptFolder, RequiredFiles, Brakujące pliki wyjściowe

Oto kolejna fajna sztuczka, którą możesz zrobić z instrukcjami if. Większość poradników, które zobaczysz, będzie zawierała instrukcje mówiące o tym, aby użyć operatora, aby sprawdzić odpowiedni stan. Na przykład tutaj moglibyśmy użyć if ($ MissingFiles -gt 0) aby sprawdzić, czy $ MissingFiles jest większe od zera. Jednakże, jeśli już używasz poleceń, które zwracają wartość boolowską (jak w poprzednim bloku, w którym używaliśmy ścieżki testowej), nie jest to konieczne. W takich przypadkach można się obejść bez tego, gdy testujesz, aby sprawdzić, czy liczba jest różna od zera. Każda niezerowa liczba (dodatnia lub ujemna) zostaje potraktowana jako prawdziwa, podczas gdy zero (lub, co może się zdarzyć tutaj, nieistniejąca zmienna) będzie traktowane jako fałszywe.

Jeśli $ MissingFiles istnieje i jest niezerowe, Write-Host opublikuje komunikat informujący o tym, ile plików brakuje i skrypt zostanie przerwany. Następnie, Remove-Variable wyczyści wszystkie zmienne, które stworzyliśmy, a Exit opuści skrypt. W zwykłej konsoli PowerShell opcja Remove-Variable nie jest tak naprawdę potrzebna do tego konkretnego celu, ponieważ zmienne ustawione przez skrypty są zwykle odrzucane po wyjściu skryptu. Jednak środowisko PowerShell ISE zachowuje się nieco inaczej, więc możesz zachować to, jeśli planujesz uruchomić skrypt z tego miejsca.

Jeśli wszystko jest w porządku, skrypt będzie kontynuowany. Jeszcze jedno przygotowanie do wykonania to pseudonim, który będziemy naprawdę zadowoleni, gdy będziemy go później.

New-Alias ​​g Get-Random

Aliasy są używane do tworzenia alternatywnych nazw dla poleceń. Mogą być przydatne, aby pomóc nam zapoznać się z nowym interfejsem (np .: PowerShell ma wbudowane aliasy, takie jak dir -> Get-ChildItem i cat -> Get-Content) lub do krótkich odwołań dla często używanych poleceń. Tutaj robimy bardzo krótka referencja dla Get-Random polecenie, które będzie używane dużo później.

Get-Random prawie robi to, co sugeruje jego nazwa. Biorąc tablicę (jak listę nazwisk) jako dane wejściowe, wybiera losowy element z tablicy i wypluwa go. Może być również używany do generowania liczb losowych.Należy jednak pamiętać o Get-Random i liczbach, że podobnie jak wiele innych operacji na komputerze, zaczyna się od zera. Zamiast tego Get-Random 10 co znaczy, że bardziej naturalny "daj mi liczbę od 1 do 10", to naprawdę znaczy "daj mi liczbę od 0 do 9." Możesz być bardziej konkretny odnośnie do wyboru liczby, tak aby Get-Random zachowywał się bardziej, jakbyś był oczekuj, ale nie będziemy tego potrzebować w tym skrypcie.

Część 2: Wprowadzanie danych przez użytkownika i dotarcie do pracy

Chociaż skrypt, który generuje tylko jedną losową nazwę i numer telefonu jest świetny, jest znacznie lepiej, jeśli skrypt pozwala użytkownikowi określić, ile nazw i numerów chce uzyskać w jednej partii. Niestety, nie możemy naprawdę zaufać użytkownikom, aby zawsze podawać prawidłowe dane wejściowe. Jest w tym trochę więcej niż tylko $ UserInput = Read-Host.

while (! $ ValidInput) spróbuj [int] $ UserInput = Read-Host -Prompt 'Elementy do wygenerowania' $ ValidInput = $ true catch Write-Host 'Nieprawidłowe dane wejściowe. Wprowadź tylko numer ". -ForegroundColor Red

Powyższa instrukcja while sprawdza i neguje wartość $ ValidInput. Tak długo, jak $ ValidInput jest fałszywe lub nie istnieje, będzie ono przechodzić przez jego blok skryptu.

Instrukcja try pobiera dane wejściowe użytkownika przez Read-Host i próbuje je przekonwertować na wartość całkowitą. (To jest [int] przed Read-Host.) Jeśli się powiedzie, ustawi wartość ValidInput na true, aby pętla while mogła wyjść. Jeśli nie powiedzie się, blok catch wysyła błąd, a ponieważ nie ustawiono zmiennej $ ValidInput, pętla while powróci i ponownie wyświetli monit użytkownika.

Gdy użytkownik odpowiednio poda numer jako dane wejściowe, chcemy, aby skrypt ogłosił, że zaraz zacznie wykonywać swoją pracę, a następnie zajmie się robieniem tego.

Write-Host "'n Generowanie $ nazw i numerów telefonów użytkownika. Prosimy o cierpliwość." 1 ... $ UserInput | ForEach-Object 

Nie martw się, nie zostawimy Cię samemu, aby wymyślić losową nazwę i kod generatora liczb. To tylko komentarz zastępczy, aby pokazać, gdzie będzie pasować następna sekcja (gdzie zostanie wykonana prawdziwa praca).

Linia Write-Host jest dość prosta. Po prostu mówi, ile nazw i numerów telefonów skrypt będzie generował, i prosi użytkownika o cierpliwość podczas wykonywania skryptu. The"nna początku i końcu łańcucha jest wstawianie pustej linii przed i po tym wyjściu, aby nadać mu wizualne oddzielenie między wierszem wejściowym a listą nazw i cyfr. Należy pamiętać, że jest to tył zwrotny ("poważny akcent" AKA - zazwyczaj klawisz powyżej zakładki, po lewej stronie 1), a nie apostrof lub pojedynczy cytat przed każdym n.

W następnej części pokazano inny sposób użycia pętli ForEach-Object. Zazwyczaj, gdy chcesz uruchomić blok skryptu określoną liczbę razy, skonfigurujesz regularną pętlę for dla ($ x = 1; $ x -le $ UserInput; x ++) .ForEach-Object pozwala nam to uprościć, podając mu listę liczb całkowitych i zamiast nakazać, aby faktycznie wykonywał cokolwiek z tymi liczbami całkowitymi, po prostu dajemy mu blok statycznego skryptu do uruchomienia, aż zabraknie liczb całkowitych, aby to zrobić.

Część 3: Generowanie losowej nazwy

Generowanie nazwy jest najprostszą częścią reszty tego procesu. Składa się tylko z trzech kroków: Wybieranie nazwiska, wybór płci i wybór imienia. Pamiętasz ten alias, który stworzyliśmy dla Get-Random na jakiś czas? Czas zacząć to wykorzystywać.

  $ Nazwisko = Get-Content "$ ScriptFolder \ Surnames.txt" | g $ Male = g 2 if ($ Male) $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" | g else $ FirstName = Get-Content "$ ScriptFolder \ Females.txt" | sol

Pierwsza linia przyjmuje naszą listę nazwisk, podaje ją do losowego selektora i przypisuje wybraną nazwę do $ Nazwisko.

Drugi wiersz wybiera płeć danej osoby. Pamiętasz, jak zaczyna się Get-Random, licząc od zera, i jak zero jest fałszywe, a wszystko inne jest prawdziwe? Tak właśnie używamy Get-Random 2 (lub znacznie krótszy g 2 dzięki naszemu pseudonimowi - oba powodują wybór między zerem lub jednym), aby zdecydować, czy nasza osoba jest płci męskiej, czy nie. Instrukcja if / else następnie losowo wybiera odpowiednio męskie lub żeńskie imię.

Część 4: Generowanie losowego numeru telefonu

Oto naprawdę zabawna część. Wcześniej pokazaliśmy, w jaki sposób można uzyskać nieprawidłowy lub fikcyjny numer telefonu. Ponieważ nie chcemy, aby wszystkie nasze liczby wyglądały zbyt podobnie, za każdym razem losowo wybieramy nieprawidłowy format liczb. Losowo wybrane formaty zostaną zdefiniowane przez ich numer kierunkowy i kod wymiany, które będą zbiorczo przechowywane jako prefiks $.

  $ NumberFormat = g 5 przełącznika ($ 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 "

Pierwsza linia to proste generowanie liczb losowych, aby wybrać format, który będziemy śledzić dla numeru telefonu. Następnie instrukcja switch przyjmuje ten losowy wybór i odpowiednio generuje prefiks $. Zapamiętaj tę listę nieprawidłowych typów numerów telefonów? Wartości $ NumberFormat 0-3 odpowiadają pierwszym czterem na tej liście. Wartość 4 może generować jedno z dwóch ostatnich, ponieważ oba używają kodu wymiany "555".

Tutaj możesz również zobaczyć, że używamy innej sztuczki z podwójnymi cudzysłowami.Podwójne cudzysłowy nie pozwalają ci tylko interpretować zmienne przed otrzymaniem łańcucha wyjściowego - umożliwiają one również przetwarzanie bloków skryptów. Aby to zrobić, należy zawinąć blok skryptu w następujący sposób: “$()”. Tak więc powyżej znajduje się wiele losowych cyfr, niektóre z nich są albo ograniczone w swoim zasięgu, albo ustawione statycznie zgodnie z zasadami, których musimy przestrzegać. Każdy ciąg ma również nawiasy i odstępy, jak zwykle spodziewamy się w parach i kodzie strefy.

Ostatnią rzeczą, którą musimy zrobić, zanim będziemy gotowi na wydrukowanie naszej nazwy i numeru telefonu, będzie wygenerowanie identyfikatora subskrybenta, który będzie przechowywany jako $ Suffix.

  switch ($ NumberFormat) $ _ -lt 4 $ Suffix = "$ (g 10) $ (g 10) $ (g 10) $ (g 10)" 4 switch ($ Prefix) '( 800) 555 '$ Suffix =' 0199 ' domyślnie $ Suffix = "01 $ (g 10) $ (g 10)"

Ze względu na specjalne zasady dotyczące 555 liczb, nie możemy po prostu wygenerować czterech losowych cyfr na koniec każdego numeru telefonu, jaki zrobi nasz skrypt. Pierwszy przełącznik sprawdza, czy mamy do czynienia z numerem 555. Jeśli nie, generuje cztery losowe cyfry. Jeśli jest to numer 555, drugi przełącznik sprawdza numer 800 obszaru. Jeśli to się zgadza, jest tylko jeden poprawny sufiks $, który możemy użyć. W przeciwnym razie można wybrać dowolną opcję między 0100-0199.

Zauważ, że istnieje kilka różnych sposobów, w jakie ten blok mógł zostać napisany, zamiast tego, jaki jest. Obie instrukcje przełączania mogły zostać zastąpione instrukcjami if / else, ponieważ każda z nich obsługuje tylko dwie opcje. Ponadto, zamiast specyficznego wywoływania "4" jako opcji dla pierwszej instrukcji switch, "default" mógł być użyty podobnie jak w drugim, ponieważ była to jedyna opcja. Wybór między if / else vs. switch, lub gdzie użyć domyślnego słowa kluczowego zamiast konkretnych wartości, często sprowadza się do osobistych preferencji. Dopóki to działa, użyj tego, co najbardziej Ci odpowiada.

Teraz czas na wyjście.

  Write-Output "$ FirstName $ Surname $ Prefix- $ Suffix"

Ten jest prawie tak prosty jak w scenariuszu. Po prostu wypisuje imię i nazwisko oddzielone spacjami, a następnie spację przed numerem telefonu. Oto gdzie dodawany jest standardowy kreska między kodem wymiany a identyfikatorem subskrybenta.

Ten nawias zamykający na końcu to koniec pętli ForEach-Object z wcześniejszych - pomiń to, jeśli już go masz.

Część 5: Oczyszczanie i uruchamianie skryptu

Po zakończeniu wszystkich prac, dobry skrypt wie, jak posprzątać po sobie. Ponownie, poniższe usunięcie zmiennej nie jest naprawdę potrzebne, jeśli uruchamiasz skrypt tylko z konsoli, ale będziesz go chciał, jeśli kiedykolwiek planujesz uruchomić go w ISE.

Alias ​​Usuń element: \ g Usuń-zmienny folder skryptów, Wymagane pliki, Nazwisko, Mężczyzna, Imię, Numerfikacja, Przedrostek, Przyrostek, Ważna wartość wejściowa, Wprowadzanie użytkownika

Po wykonaniu wszystkich czynności zapisz skrypt z rozszerzeniem ".ps1" w tym samym folderze co pliki z nazwami. Upewnij się, że opcja ExecutionPolicy jest ustawiona tak, aby skrypt mógł działać i nadać mu wir.

Oto zrzut ekranu skryptu w akcji:

Możesz również pobrać plik ZIP zawierający ten skrypt PowerShell i pliki tekstowe z listami nazw, korzystając z poniższego linku.

Generator losowych nazw i numerów telefonów dla PowerShell