10Sep

Jak generować losowe nazwy iNumery telefonów z PowerShell

Jeśli 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ę.

Co jest potrzebne

Zanim zaczniesz, potrzebujesz kilku narzędzi i informacji:

PowerShell

Ten skrypt został opracowany przy użyciu PowerShell 4.0 i 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 systemem Windows 7. Użytkownicy Windows XP SP3 i Vista( SP1 lub nowszy) mogą pobrać odpowiednią wersję WMF od firmy Microsoft w wersji 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ł listy nazw do podania do generatora losowego.Świetnym źródłem dla serii nazwisk i informacji dotyczących ich popularności( choć nie będzie to używane 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 Imiona
  • Female First Name

Niezależnie od używanego źródła, konieczne będzie wygenerowanie trzech plików tekstowych, 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 Brązowy

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

James John Robert Michael William

Females.txt powinien zawierać kobiece imiona, z których skrypt ma wybierać.Przykład:

Mary Patricia Linda Barbara Elizabeth

Zasady dotyczące 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óre zostaną wygenerowane 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 programu Exchange nie mogą rozpoczynać się od 1 lub 0.
  • ( 752) 811-1375
    Ta liczba jest niepoprawna, 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.

Common Commands

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 pisanie 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 $ _ używana jest do odniesienia do aktualnie przetwarzanego elementu.
  • , jeśli. .. else Instrukcje umożliwiają wykonanie operacji tylko pod warunkiem spełnienia określonych warunków i( opcjonalnie) określenia, co należy zrobić, gdy ten warunek nie zostanie spełniony. Przełącznik
  • Instrukcje są podobne, jeśli instrukcje zawierają więcej 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 również używają zmiennej $ _, aby odnieść się do aktualnie przetwarzanego elementu.
  • , natomiast instrukcje umożliwiają 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.
  • try. .. catch 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ł.
  • Get-Content robi to, co mówi na opakowaniu. 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 elementy 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 wyjście. 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

Nadszedł czas, aby zabrudzić nasze ręce.

Część 1: Przygotowanie do pracy

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

Clear-Host

Teraz, gdy mamy czysty ekran, następnym krokiem jest sprawdzenie skryptu, aby upewnić się, że wszystko, czego potrzebuje, jest na swoim 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ą 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 innymkatalog roboczy.

Druga linia tworzy tablicę nazw plików, które są wymagane 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, 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. Wykrzyknikiem jest operator a nie , który odwraca odpowiedź Test-Path 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. W tym przypadku podwójne cudzysłowy oznaczają, że zamiast uruchamiać -ścieżkę testową "$ ScriptFolder \ $ _" będziemy robili coś bardziej podobnego do Test-Path 'C: \ Scripts \ Surnames.txt' ( zakładając, żeskrypt znajduje się w C: \ Scripts, a ForEach-Object pracuje obecnie nad "Nazwiskiem.txt").

Dla każdego znalezionego pliku, Write-Host wyświetli komunikat o błędzie na czerwono, informujący, który z plików nie istnieje. 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źć pliku źródłowego $ MissingFiles. Przerwanie skryptu."-ForegroundColor Red Remove-Variable ScriptFolder, RequiredFiles, MissingFiles Exit}

Oto kolejna fajna sztuczka, którą możesz zrobić za pomocą instrukcji 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ć , jeśli( $ MissingFiles -gt 0) , aby zobaczyć, 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 w rzeczywistości nie jest 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żą do tworzenia alternatywnych nazw dla poleceń.Może to być przydatne, aby pomóc nam zapoznać się z nowym interfejsem( np. PowerShell ma wbudowane aliasy, takie jak: dir - & gt; Get-ChildItem i cat - & gt; Get-Content ) lub tworzyć krótkie referencjedla często używanych poleceń.Tutaj tworzymy bardzo skrótową instrukcję dla polecenia Get-Random , które będzie później 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. Więc zamiast Get-Random 10 oznacza bardziej naturalny "daj mi liczbę od 1 do 10", to naprawdę znaczy "daj mi liczbę od 0 do 9." Możesz być bardziej konkretny o wyborze liczby, aby uzyskać-Random zachowuje się bardziej, jak można się było spodziewać, ale nie będziemy tego potrzebować w tym skrypcie.

Część 2: Wprowadzanie i wprowadzanie użytkownika

Podczas gdy skrypt generuje tylko jedną losową nazwę &numer telefonu jest świetny, jest znacznie lepiej, jeśli skrypt pozwala użytkownikowi określić, ile nazw i znakównumery, 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 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.

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 "` nGenerating $ UserInput names & numery telefonów. Please please patient. n "1. . $ UserInput |ForEach-Object{ & # INSERT RANDOM NAME &NUMER GENERATOR TUTAJ # & gt;}

Nie martw się, nie zostawimy ciebie samego, aby wymyślić losową nazwę &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. `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 wierszem wejściowym a listą nazw &liczby. 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 cudzysłów przed każdym n .

Następna część pokazuje inny sposób użycia pętli ForEach-Object. Zwykle, gdy chcesz, aby blok skryptu działał określoną liczbę razy, skonfigurujesz regularną pętlę for, taką jak dla( $ x = 1; $ x -le $ UserInput; $ x ++){ ForEach-Object pozwala nam to uprościć, podając mu listę liczb całkowitych i zamiast nakazać, by 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" |g}

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

Drugi wiersz wybiera płeć naszej osoby. Pamiętasz, jak zaczyna się Get-Random licząc od zera i jak zero jest fałszywe, a wszystko inne jest prawdziwe? W ten sposób używamy Get-Random 2 ( lub znacznie krótszego g 2 dzięki naszemu aliasowi - 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 losowych liczb, aby wybrać formatprzejdziemy za numerem 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 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: "$( & lt; #SCRIPT HERE # & gt;)" .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.

Ostatnia rzecz, którą musimy zrobić, zanim będziemy gotowi wypuścić nasze imię i nazwisko.numer telefonu służy do generowania identyfikatora subskrybenta, który będzie przechowywany jako $ Suffix. Przełącznik

( $ NumberFormat){ {$ _ -lt 4}{ $ Suffix = "$( g 10) $( g 10) $( g 10) $( g 10)"} 4{ przełącznik( prefiks $){ '(800) 555 '{$ Suffix =' 0199 '} default{ $ Suffix = "01 $( g 10) $( g 10)"}}}}

Ze względu na specjalne zasady dotyczące 555 liczb, nie możemy po prostuwygeneruj cztery losowe cyfry 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, jest tylko jeden poprawny sufiks $, który możemy wykorzystać.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 nadszedł czas na wyjście.

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

Ten jest prawie tak prosty jak w skrypcie. 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 dole to koniec pętli ForEach-Object z wcześniejszych - pomiń to, jeśli już go masz.

Część 5: Czyszczenie i uruchamianie skryptu

Po wykonaniu wszystkich prac, dobry skrypt wie, jak po sobie posprzątać.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.

Usuń alias pozycji: \ g Usuń-zmienny folder skryptów, wymagane pliki, nazwisko, mężczyzna, imię, numeratrybut, prefiks, sufiks, ważna wartość wejściowa, userInput

Po wykonaniu wszystkich czynności zapisz skrypt z rozszerzeniem ".ps1"w tym samym folderze, co pliki z nazwiskami. 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 także pobrać plik ZIP zawierający ten skrypt PowerShell i pliki tekstowe z listami nazw, z poniższego linku.

Random Name &Generator numerów telefonów dla PowerShell