Головна » як » Як створити випадкові імена та телефонні номери за допомогою PowerShell

    Як створити випадкові імена та телефонні номери за допомогою PowerShell

    Коли вам потрібен набір даних для тестування або демонстрації, і цей набір повинен представляти особисту інформацію (PII), ви зазвичай не хочете використовувати реальні дані, що представляють реальних людей. Тут ми розглянемо, як ви можете використовувати PowerShell для створення списку випадкових імен і телефонних номерів для такої події.

    Що тобі потрібно

    Перед початком роботи існують деякі інструменти та інформація, які потрібно мати:

    PowerShell

    Цей сценарій був розроблений з використанням PowerShell 4.0, а також був перевірений на сумісність з PowerShell 2.0. PowerShell 2.0 або пізнішої версії був вбудований у Windows з Windows 7. Він також доступний для Windows XP і Vista як частина Windows Management Framework (WMF). Нижче наведено деякі деталі та посилання для завантаження.

    • PowerShell 2.0 постачається з Windows 7. Користувачі Windows XP SP3 і Vista (SP1 або новіші версії) можуть завантажити відповідну версію WMF від Microsoft у форматі KB968929. Він не підтримується на XP SP2 або нижче, або Vista без SP1.
    • PowerShell 4.0 поставляється з Windows 8.1. Користувачі Windows 7 з пакетом оновлень 1 (SP1) можуть оновити його як частину оновлення WMF з центру завантаження Microsoft. Він не доступний для XP або Vista.

    Імена

    Вам знадобляться деякі списки імен для подачі у генератор випадкових даних. Відмінним джерелом для багато імен та інформації про їхню популярність (хоча це не буде використано для цього сценарію), - Бюро перепису населення США. Списки, доступні за посиланнями, наведені нижче, дуже великі, тому ви можете трохи обрізати їх, якщо ви плануєте генерувати багато імен і номерів одночасно. У нашій тестовій системі кожна пара назв / номерів зайняла приблизно 1,5 секунди для створення з використанням повного списку, але ваш пробіг змінюється залежно від специфічних характеристик системи.

    • Прізвища
    • Чоловічі прізвища
    • Жіночі прізвища

    Незалежно від використовуваного джерела, вам потрібно створити три текстові файли, які сценарій може використовувати як пули для вибору імені. Кожен файл повинен містити лише імена та лише одне ім'я на рядок. Вони повинні зберігатися в тій же папці, що й сценарій PowerShell.

    Файли має містити прізвища, з яких потрібно вибрати сценарій. Приклад:

    Сміт Джонсон Вільямс Джонс Браун

    Males.txt має містити перші чоловічі імена, з яких потрібно вибрати сценарій. Приклад:

    Джеймс Джон Роберт Майкл Вільям

    Females.txt має містити перші жіночі імена, з яких потрібно вибрати сценарій. Приклад:

    Марія Патрісія Лінда Барбара Елізабет

    Правила для телефонних номерів

    Якщо ви хочете бути впевнені, що ваші телефонні номери не збігаються з реальним номером телефону, найпростішим способом є використання відомого коду обміну "555". Але якщо ви збираєтеся показувати набір даних з великою кількістю телефонних номерів, то 555 почне виглядати досить монотонно реально швидко. Щоб зробити речі цікавішими, ми створимо інші телефонні номери, які порушують правила Північноамериканського плану нумерації (NANP). Нижче наведені деякі зразки недійсних номерів телефонів, що представляють кожен клас номерів, який буде створено цим сценарієм:

    • (157) 836-8167
      Це число недійсне, оскільки коди областей не можуть починатися з 1 або 0.
    • (298) 731-6185
      Це число недійсне, оскільки NANP не призначає коди місцевості з 9 як другу цифру.
    • (678) 035-7598
      Це число недійсне, оскільки коди обміну не можуть починатися з 1 або 0.
    • (752) 811-1375
      Це число недійсне, тому що коди обміну не можуть закінчуватися двома 1s.
    • (265) 555-0128
      Цей номер недійсний, оскільки код обміну 555, і ідентифікатор абонента в межах діапазону, зарезервованого для фіктивних номерів.
    • (800) 555-0199
      Це число - це єдиний номер з 800 кодом обміну 555, який зарезервовано для використання як фіктивний номер.

    Зауважте, що наведені вище правила можуть змінюватися і можуть змінюватися залежно від юрисдикції. Необхідно виконати власне дослідження, щоб перевірити існуючі правила, які застосовуються до локалі, для якої ви створюватимете телефонні номери.

    Загальні команди

    Є деякі досить поширені команди, які будуть використовуватися в цьому сценарії, так що ви повинні отримати основну ідею про те, що це означає, перш ніж ми зануримося в написання його.

    • Длякожного об'єкта приймає масив або список об'єктів і виконує задану операцію на кожному з них. У блоці сценаріїв ForEach-Object змінна $ _ використовується для позначення поточного оброблюваного елемента.
    • якщо… ще оператори дозволяють виконувати операцію тільки при дотриманні певних умов, і (необов'язково) вказувати, що слід робити, коли ця умова не виконується.
    • перемикач висловлювання подібні до тверджень з більшим вибором. Комутатор перевірятиме об'єкт на декілька умов і виконуватиме будь-які блоки сценаріїв для умов, з якими об'єкт відповідає. Ви також можете, необов'язково, вказати блок за замовчуванням, який буде запускатися, лише якщо інші умови не збігаються. Висловлювання switch також використовує змінну $ _, щоб посилатися на поточний оброблюваний елемент.
    • час оператори дозволяють безперервно повторювати блок сценаріїв, доки виконується певна умова. Як тільки щось трапиться, що призводить до того, що умова перестане бути істинним, коли блок сценарію закінчений, цикл завершується.
    • спробуйте… ловити оператори допомагають при обробці помилок. Якщо з блоком сценаріїв, вказаним для спроби, щось піде не так, блок блокування буде запущено.
    • Get-Content робить те, що він говорить на олово. Він отримує вміст заданого об'єкта - зазвичай файл. Це може бути використано для відображення вмісту текстового файлу на консолі або, як у цьому сценарії, передачі вмісту уздовж конвеєра, який буде використовуватися з іншими командами.
    • Write-Host поміщає матеріал у консоль. Це використовується для представлення повідомлень користувачеві і не входить до виводу сценарію, якщо вихід перенаправляється.
    • Вивід запису фактично генерує вихідні дані. Зазвичай це скидається до консолі, але її також можна перенаправити іншими командами.

    У скрипті є й інші команди, але ми їх будемо пояснювати.

    Створення сценарію

    Тепер настав час брудніти руками.

    Частина 1: Підготовка до роботи

    Якщо ви хочете, щоб ваш скрипт запускався з чистої консолі, ось перша лінія, яку ви хочете в ній.

    Clear-Host

    Тепер, коли у нас є чистий екран, наступне, що ми хочемо зробити, це перевірка сценарію, щоб переконатися, що все, що потрібно, є на місці. Щоб зробити це, ми повинні почати, розповівши, де шукати, і що шукати.

    $ ScriptFolder = Спліт-шлях $ MyInvocation.MyCommand.Definition -Parent $ RequiredFiles = ('Males.txt', 'Females.txt', 'Names.txt')

    Перший рядок є дуже корисним для будь-якого сценарію. Він визначає змінну, яка вказує на папку, що містить сценарій. Це важливо, якщо скрипт потребує інших файлів, які знаходяться в тому ж самому каталозі (або відомому відносному шляху з цього каталогу), оскільки в іншому випадку виникатимуть помилки, якщо і коли ви намагаєтеся запустити сценарій, коли ви знаходитесь робочий каталог.

    Другий рядок створює масив імен файлів, необхідних для належного виконання сценарію. Ми будемо використовувати це, разом із змінною $ ScriptFolder, у наступному фрагменті, де ми перевіряємо наявність цих файлів.

    $ RequiredFiles | ДляEach-Object if (! (Test-Path "$ ScriptFolder \ _")) Write-Host "$ _ not found." -ForegroundColor Red $ MissingFiles ++

    Цей фрагмент скрипта посилає масив $ RequiredFiles в блок ForEach-Object. У цьому блоці скриптів оператор if використовує Test-Path, щоб перевірити, чи є файл, який ми шукаємо, де він належить. Test-Path - це проста команда, яка, коли задається шлях до файлу, повертає базову істинну або помилкову відповідь, щоб повідомити нам, чи вказує шлях на те, що існує. Знак оклику є ні Оператор, який скасовує відповідь Test-Path перед передачею його на оператор if. Отже, якщо Test-Path повертає false (тобто файл, який ми шукаємо, не існує), він буде перетворений у true, так що оператор if виконає його блок сценаріїв.

    Інша річ, яку слід зазначити тут, яка часто буде використовуватися в цьому скрипті, це використання подвійних лапок замість одиночних лапок. Коли ви поміщаєте щось у одне лапки, PowerShell розглядає його як статичний рядок. Все, що є в одинарних лапках, буде передано саме так, як є. Подвійні лапки повідомляють PowerShell про переведення змінних і деяких інших спеціальних елементів у рядок перед тим, як передати їх. Тут подвійні лапки означають, що замість того, щоб працювати Тест-шлях '$ ScriptFolder \ t  насправді ми будемо робити щось більше Тестовий шлях "C: Сценарії \ t (припускаючи, що ваш скрипт знаходиться в папці C: Scripts, а ForEach-Object в даний час працює над 'Names.txt').

    Для кожного файлу не знайдено, Write-Host розмістить повідомлення про помилку червоним кольором, щоб повідомити, який файл відсутній. Потім вона збільшує змінну $ MissingFiles, яка буде використана в наступному фрагменті, до помилки і виходу, якщо відсутні будь-які файли.

    if ($ MissingFiles) Write-Host "Не вдалося знайти вихідний файл (і) $ MissingFiles. Скасування сценарію." -ForegroundColor Червона папка-сценарій, що вилучає змінну, обов'язковіфайли, вихідні файли з відсутністю файлів

    Ось ще один акуратний трюк, який ви можете зробити, якщо висловлювання. Більшість керівництв ви побачите, якщо оператори скажуть вам використовувати оператор для перевірки відповідності умові. Наприклад, тут можна використовувати if ($ MissingFiles -gt 0) щоб побачити, якщо $ MissingFiles більше нуля. Однак, якщо ви вже використовуєте команди, які повертають логічне значення (як у попередньому блоці, де ми використовували Test-Path), це не є необхідним. Ви також можете обійтися без нього в таких випадках, коли ви просто тестуєте, щоб побачити, чи число не є нульовим. Будь-яке ненульове число (позитивне чи негативне) розглядається як істинне, тоді як нуль (або, як це може відбуватися, неіснуюча змінна) буде вважатися помилковим.

    Якщо $ MissingFiles існує і є ненульовим, Write-Host розмістить повідомлення, яке повідомляє, скільки файлів було відсутнє і що сценарій буде перервано. Потім Remove-Variable очистить всі змінні, які ми створили, і Exit вийде з сценарію. На звичайній консолі PowerShell програма Remove-Variable дійсно не потрібна для цієї мети, оскільки змінні, встановлені сценаріями, зазвичай видаляються, коли сценарій завершується. Тим не менш, PowerShell ISE поводиться трохи по-іншому, так що ви можете зберегти це, якщо ви плануєте запускати сценарій звідти.

    Якщо все в порядку, сценарій продовжуватиметься. Ще одна підготовка - це псевдонім, який ми будемо дуже раді пізніше.

    Новий псевдонім g Get-Random

    Псевдоніми використовуються для створення альтернативних імен для команд. Вони можуть бути корисними, щоб допомогти нам ознайомитися з новим інтерфейсом (наприклад: PowerShell має вбудовані псевдоніми, наприклад dir -> Get-ChildItem і cat -> Get-Content) або для коротких посилань для часто використовуваних команд. Тут ми робимо дуже короткий довідник для Get-Random команда, яка буде використана пізніше.

    Get-Random значною мірою робить те, що має на увазі його назва. Враховуючи масив (як список імен) як вхідних даних, він вибирає випадковий елемент з масиву і виводить його. Він також може бути використаний для генерації випадкових чисел. Слід пам'ятати про Get-Random і числа, хоча, як і багато інших комп'ютерних операцій, він починає відлік від нуля. Так замість Get-Random 10 що означає більш природний "дайте мені число від 1 до 10", це дійсно означає "дайте мені число від 0 до 9." Ви можете бути більш конкретними щодо вибору номера, так що Get-Random поводиться більше, як ви природньо очікуйте, але нам це не потрібно в цьому сценарії.

    Частина 2: Отримання вводу користувача та отримання роботи

    Хоча сценарій, який генерує лише одне випадкове ім'я та номер телефону, є великим, набагато краще, якщо скрипт дозволяє користувачеві вказати, скільки імен та номерів вони хочуть отримати в одному пакеті. На жаль, ми не можемо довіряти користувачам завжди вводити правильні дані. Отже, це трохи більше, ніж просто $ UserInput = Read-Host.

    while (! $ ValidInput) try [int] $ UserInput = Read-Host -Prompt 'Об'єкти, які будуть згенеровані' $ ValidInput = $ true catch Write-Host 'Неправильний вхід. Введіть лише номер. ' -ForegroundColor Red

    Вищезгадана операція while перевіряє значення $ ValidInput і забирає його значення. До тих пір, поки $ ValidInput є помилковим або не існує, він продовжуватиме цикл через блок сценаріїв.

    Оператор try використовує вхід користувача через Read-Host і намагається перетворити його на ціле значення. (Це [int] перед читанням-хостом.) Якщо воно буде успішним, воно встановить $ ValidInput на true, так що цикл while може вийти. Якщо не вдалося, блок блокування надсилає повідомлення про помилку і, оскільки $ ValidInput не встановлено, цикл while повернеться назад і знову підкаже користувачеві.

    Після того, як користувач належним чином вказав номер як вхідний сигнал, ми хочемо, щоб скрипт оголосив, що він збирається розпочати свою справу, а потім виконати його.

    Write-Host "'nGenerating $ UserInput вводу та телефонні номери. Будьте терплячими." 1 ... $ UserInput | ForEach-Object 

    Не хвилюйтеся, ми не залишимо вас самостійно, щоб з'ясувати код генератора випадкових імен і номерів. Це лише коментар із заповнювачем, який покаже вам, де буде йти наступний розділ (де реальна робота).

    Лінія Write-Host досить проста. Він просто говорить, скільки імен і телефонних номерів сценарій буде генерувати, і просить користувача бути терплячим, поки сценарій виконує свою роботу. The'n на початку і в кінці рядка слід вставити порожній рядок до і після цього виводу, просто щоб надати йому деяке візуальне розділення між вхідною лінією і списком імен і чисел. Майте на увазі, що це зворотний клік (AKA "серйозний акцент" - зазвичай ключ над вкладкою, ліворуч від 1), а не апостроф або одна цитата перед кожним n.

    Наступна частина показує інший спосіб використання циклу об'єктів ForEach-Object. Зазвичай, коли ви хочете, щоб блок сценарію виконувався певну кількість разів, ви налаштуєте звичайний для циклу, як для ($ x = 1; $ x -le $ UserInput; $ x ++) . ForEach-Object дозволяє нам спростити це, додавши до нього список цілих чисел, і замість того, щоб сказати, що він дійсно робить ці цілі числа, ми просто надаємо йому статичний блок сценаріїв, щоб він працював, поки не закінчиться ціле число, щоб зробити це для.

    Частина 3: Створення випадкового імені

    Генерування імені є найпростішим фрагментом цього процесу. Він складається лише з трьох кроків: вибір прізвища, вибір статі та вибір імені. Пам'ятайте, що псевдонім, який ми зробили для Get-Random деякий час назад? Час, щоб почати використовувати це.

        $ Прізвище = Get-Content "$ ScriptFolder \ t g $ Male = g 2 if ($ Male) $ FirstName = Get-Content "$ ScriptFolder Males.txt" | g ще $ FirstName = Get-Content "$ ScriptFolder Females.txt" | g

    Перший рядок займає наш список прізвищ, подає його до випадкового вибору і призначає вибране ім'я $ Прізвище.

    Другий рядок вибирає стать нашої особи. Пам'ятайте, як Get-Random починає рахувати з нуля, і як нуль є помилковим, а все інше - правдою? Ось як ми використовуємо Get-Random 2 (або набагато коротше g 2 завдяки нашому псевдоніму - обидва результату у виборі між нулем або одним), щоб вирішити, чи є наша людина чоловіком чи ні. Заяву if / else після цього випадковим чином вибирає чоловіче або жіноче ім'я відповідно.

    Частина 4: Створення випадкового номера телефону

    Ось дійсно цікава частина. Раніше ми показували, як існує кілька способів зробити недійсний або вигаданий номер телефону. Оскільки ми не хочемо, щоб всі наші цифри виглядали занадто схожими один на одного, ми будемо випадковим чином вибирати недійсний формат номера кожного разу. Довільно вибрані формати визначатимуться їх кодом місцевості та кодом обміну, які разом зберігатимуться у вигляді префікса $.

        $ NumberFormat = g 5 перемикач ($ 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 "

    Перший рядок - це просто генерація випадкових чисел для вибору формату, за яким ми будемо стежити за номером телефону. Потім оператор switch приймає цей випадковий вибір і генерує відповідний префікс $. Пам'ятайте той список недійсних типів телефонів? Значення $ NumberFormat 0-3 відповідають першим у списку. Значення 4 може генерувати одне з останніх двох, оскільки обидва використовують код обміну "555".

    Тут ви також можете побачити, що ми використовуємо інший трюк з подвійними лапками. Подвійні лапки не дозволяють інтерпретувати змінні до виходу рядка - вони також дозволяють обробляти блоки сценаріїв. Для цього оберніть блок сценарію таким чином: "$ ()". Таким чином, ви маєте багато індивідуально рандомізованих цифр, деякі з яких або обмежені в діапазоні, або встановлені статично відповідно до правил, які ми повинні дотримуватися. Кожен рядок також має дужки та інтервали, як ви зазвичай очікуєте бачити у парі Код коду та Коду Exchange.

    Останнє, що потрібно зробити, перш ніж ми будемо готові вивести наше ім'я та номер телефону, - це генерування ідентифікатора підпису, який буде збережено як $ Suffix.

        switch ($ NumberFormat) $ _ -lt 4 $ Suffix = "$ (g 10) $ (g 10) $ (g 10) $ (g 10)" 4 switch ($ Prefix) '( 800) 555 '$ Suffix =' 0199 ' за замовчуванням $ Suffix = "01 $ (g 10) $ (g 10)"

    Через спеціальні правила для 555 номерів, ми не можемо просто генерувати чотири випадкові цифри для кінця кожного телефонного номера, який буде робити наш скрипт. Отже, перший перемикач перевіряє, чи маємо ми справу з номером 555. Якщо ні, то він генерує чотири випадкові цифри. Якщо це номер 555, другий перемикач перевіряє код області 800. Якщо це збігається, є тільки один дійсний $ Suffix, який ми можемо використовувати. В іншому випадку можна вибрати щось між 0100-0199.

    Зауважте, що існує декілька різних способів написання цього блоку, а не способу його написання. Обидва оператори комутації могли бути замінені операторами if / else, оскільки кожен з них обробляє тільки два варіанти. Крім того, замість конкретного виклику "4" як опції для першої операції перемикача, "типовим" можна було б використовувати, подібно до того, як це було зроблено у другому, оскільки це був єдиний варіант, що залишився. Вибір між if / else vs. перемикачем, або де використовувати ключове слово за замовчуванням замість конкретних значень, часто зводиться до питання особистих уподобань. Поки він працює, використовуйте все, що вам найбільше подобається.

    Тепер настав час виходу.

        Write-Output "$ FirstName $ Прізвище $ Prefix-$ Suffix"

    Це дуже просто, як він потрапляє в сценарій. Він просто виводить ім'я та прізвище, розділені пробілами, а потім інший простір перед номером телефону. Тут додається також стандартний тире між кодом Exchange та ідентифікатором абонента.

    Ця закриваюча дужка внизу - це кінець циклу ForEach-Object від попереднього - опустіть це, якщо ви вже отримали його.

    Частина 5: Очищення і запуск сценарію

    Після того, як вся робота завершена, хороший сценарій знає, як прибирати після себе. Знову ж таки, вилучення змінної нижче не потрібне, якщо ви збираєтеся запускати скрипт з консолі, але ви хочете, якщо ви плануєте запустити її в ISE.

    Псевдонім видалення елемента: Видалити папку сценарію, обов'язкові файли, прізвище, чоловіки, ім'я, номер формату, префікс, суфікс, введення, вхід користувача

    Після того, як ви все це зробите, збережіть скрипт з розширенням ".ps1" в тій же папці, що й файли імен. Переконайтеся, що ваш ExecutionPolicy встановлений так, щоб скрипт міг працювати, і надати йому завихрення.

    Ось знімок екрана сценарію в дії:

    Також можна завантажити ZIP-файл, що містить цей сценарій PowerShell, і текстові файли зі списками імен за посиланням нижче.

    Випадкове ім'я та генератор номерів телефонів для PowerShell