Główna » jak » Jak generować losowe nazwy i numery telefonów za pomocą PowerShell

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

    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 rzeczywiste osoby. 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 dodatkowe 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 z Microsoft w KB968929. To nie jest obsługiwane 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. Świetne źródło dla 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ć listę pełną, ale Twój przebieg będzie się różnić w zależności od specyfikacji Twojego systemu.

    • Nazwiska
    • Male First Names
    • Kobiece pierwsze imiona

    Bez względu na używane źródło, będziesz musiał wygenerować trzy pliki tekstowe, które skrypt może używać jako puli 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 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 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 nieprawidłowa, 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
      Ten numer jest nieprawidłowy, ponieważ Kody wymiany nie mogą kończyć się dwoma 1s.
    • (265) 555-0128
      Ten numer jest nieprawidłowy, ponieważ kod Exchange ma numer 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ś uzyskać podstawowe pojęcie o tym, co to znaczy, zanim zanurkujemy w pisaniu tego.

    • 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ą wykonywać operacje 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ększą liczbą opcji. 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 używają także zmiennej $ _ do odnoszenia 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 po zakończeniu bloku skryptu, 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 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.
    • Zapis-wyjście faktycznie generuje wynik. Normalnie 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 na co zwrócić uwagę.

    $ 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ą, która wskazuje 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 znana ścieżka względna 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 następnym 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, w którym 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 false (to znaczy, że szukany plik nie istnieje), zostanie przekonwertowany na 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. Kiedy umieszczasz 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 zmienną $ 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. Jeśli jednak już używasz komend, które zwracają wartość logiczną (jak w poprzednim bloku, w którym używaliśmy ścieżki testowej), nie jest to konieczne. Bez tego można się obejść w takich przypadkach, gdy testuje się, 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 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 alias, który będziemy naprawdę zadowoleni z późniejszego.

    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 skrótowe odniesienie do 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. Tym, co należy pamiętać o Get-Random i liczbach, jest to, że podobnie jak wiele innych operacji komputerowych, zaczyna odliczać od zera. Więc zamiast 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 w kwestii 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ć liczbę nazw i numerów, które chcą 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 przyjmuje dane wprowadzane przez Read-Host i próbuje przekonwertować je 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 i, ponieważ $ ValidInput nie zostało ustawione, pętla while powróci i ponownie wyświetli monit użytkownika.

    Po podaniu przez użytkownika liczby jako danych wejściowych, chcemy, aby skrypt ogłosił, że zaraz zacznie wykonywać swoją pracę, a następnie robi to.

    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, który pokazuje, 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"n na początku i końcu łańcucha jest wstawianie pustej linii przed i po tym wyjściu, aby nadać mu wizualne oddzielenie między linią wejściową 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 for ($ x = 1; $ x -le $ UserInput; $ x ++) . ForEach-Object pozwala nam to uprościć, podając mu listę liczb całkowitych i zamiast mówić, że faktycznie robi cokolwiek z tymi liczbami całkowitymi, po prostu dajemy mu blok statycznego skryptu do uruchomienia, aż zabraknie liczb całkowitych, aby zrobić to dla.

    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? 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ę losowanie Get-Random 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, że istnieje kilka sposobów na podanie nieważnego lub fikcyjnego numeru 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 będą określone 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 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ć jedną z dwóch ostatnich, ponieważ obie korzystają z kodu wymiany "555".

    Tutaj możesz także 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 także przetwarzanie bloków skryptu. Aby to zrobić, należy zawinąć blok skryptu w następujący sposób: "$ ()". Tak więc powyżej znajduje się wiele losowo wybranych cyfr, niektóre z nich są ograniczone lub są ustawiane statycznie zgodnie z zasadami, których musimy przestrzegać. Każdy ciąg ma również nawiasy i spacje, jak zwykle można się spodziewać w kodzie obszaru lokalnego i kodu wymiany.

    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 końcu 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, istnieje tylko jeden poprawny sufiks $, który możemy wykorzystać. W przeciwnym razie można wybierać spośród wartości 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 wywoływania "4" jako opcji dla pierwszej instrukcji switch, "default" mógł zostać 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żywaj wszystkiego, 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 wcześniej - pomiń to, jeśli już to masz.

    Część 5: Oczyszczanie i uruchamianie skryptu

    Po wykonaniu 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 potrzebować, jeśli kiedykolwiek planujesz uruchomić go w ISE.

    Alias ​​Usuń element: \ g Usuń-zmienny folder skryptów, wymagane pliki, nazwisko, mężczyzna, imię, numeratrybut, prefiks, sufiks, ważna wartość wejściowa, dane 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 do programu PowerShell