Домашняя » как » Как генерировать случайные имена и номера телефонов с помощью 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 могут выполнить обновление до него в рамках обновления WMF из центра загрузки Microsoft. Это не доступно для XP или Vista.

    имена

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

    • Фамилии
    • Мужские имена
    • Женские имена

    Независимо от источника, который вы используете, вам нужно будет сгенерировать три текстовых файла, которые скрипт может использовать в качестве пулов для выбора своего имени. Каждый файл должен содержать только имена и только одно имя в строке. Они должны храниться в той же папке, что и сценарий PowerShell..

    Surnames.txt должен содержать фамилии, которые вы хотите выбрать из сценария. Пример:

    Смит Джонсон Уильямс Джонс Браун

    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
      Этот номер недействителен, потому что коды Exchange не могут заканчиваться двумя 1.
    • (265) 555-0128
      Этот номер недействителен, потому что код биржи 555, а также идентификатор подписчика находится в пределах диапазона, зарезервированного для вымышленных номеров.
    • (800) 555-0199
      Этот номер является единственным номером 800 с кодом обмена 555, который зарезервирован для использования в качестве вымышленного номера..

    Обратите внимание, что вышеуказанные правила могут быть изменены и могут варьироваться в зависимости от юрисдикции. Вам следует провести собственное исследование, чтобы проверить текущие правила, применимые к локали, для которой вы будете генерировать телефонные номера..

    Общие команды

    Есть несколько довольно общих команд, которые будут использоваться в этом скрипте, поэтому вы должны получить общее представление о том, что они означают, прежде чем мы углубимся в его написание..

    • ForEach-Object принимает массив или список объектов и выполняет указанную операцию для каждого из них. В блоке сценария ForEach-Object переменная $ _ используется для ссылки на текущий обрабатываемый элемент..
    • если еще операторы позволяют выполнять операцию только при соблюдении определенных условий и (необязательно) указывать, что следует делать, если это условие не выполняется.
    • переключатель заявления похожи на заявления с большим выбором. Switch проверит объект на соответствие нескольким условиям и запустит любые блоки скриптов, указанные для условий, которые соответствуют объекту. Вы также можете, по желанию, указать блок по умолчанию, который будет выполняться только в том случае, если не найдены другие условия. Операторы Switch также используют переменную $ _ для ссылки на текущий обрабатываемый элемент.
    • в то время как операторы позволяют непрерывно повторять блок скрипта, пока выполняется определенное условие. Когда происходит что-то, что приводит к тому, что условие перестает быть истинным после завершения блока скрипта, цикл завершается.
    • попробуй поймать операторы помогают с обработкой ошибок. Если что-то пойдет не так с блоком скрипта, указанным для try, блок catch запустится.
    • Get-Content делает то, что говорит на жестяной банке. Он получает содержимое указанного объекта - обычно файла. Это может использоваться для отображения содержимого текстового файла на консоли или, как в этом сценарии, для передачи содержимого по конвейеру для использования с другими командами.
    • Написать-Host кладет вещи в консоль. Используется для представления сообщений пользователю и не включается в выходные данные скрипта, если выходные данные перенаправляются.
    • Write-Output на самом деле генерирует вывод. Обычно это выводится на консоль, но также может быть перенаправлено другими командами.

    В сценарии есть и другие команды, но мы объясним их по ходу дела.

    Создание сценария

    Теперь пришло время пачкать руки.

    Часть 1. Подготовка к работе

    Если вам нравится, что ваш скрипт запускается с чистой консоли, вот первая строка, которую вы хотите в нем.

    Clear-Host

    Теперь, когда у нас есть чистый экран, мы хотим проверить скрипт, чтобы убедиться, что все, что ему нужно, на месте. Чтобы сделать это, нам нужно начать с того, чтобы сказать, где искать и что искать.

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

    Первая строка там очень полезна для любого скрипта. Он определяет переменную, которая указывает на папку, содержащую скрипт. Это важно, если вашему сценарию нужны другие файлы, которые находятся в том же каталоге, что и он сам (или известный относительный путь из этого каталога), поскольку в противном случае вы столкнетесь с ошибками, если и когда вы попытаетесь запустить сценарий, находясь в другом рабочий каталог.

    Вторая строка создает массив имен файлов, необходимых для правильной работы скрипта. Мы будем использовать это вместе с переменной $ ScriptFolder в следующей части, где мы проверим, чтобы убедиться, что эти файлы присутствуют.

    $ RequiredFiles | ForEach-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 переводить переменные и некоторые другие специальные элементы в строке перед передачей. Здесь двойные кавычки означают, что вместо запуска Test-Path '$ ScriptFolder \ $ _'  мы на самом деле будем делать что-то более похожее Тест-путь 'C: \ Scripts \ Surnames.txt' (при условии, что ваш скрипт находится в C: \ Scripts, а ForEach-Object в настоящее время работает над 'Surnames.txt').

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

    if ($ MissingFiles) Write-Host "Не удалось найти исходный файл (и) $ MissingFiles. Сценарий прерывания." -ForegroundColor Red Remove-Variable ScriptFolder, RequiredFiles, MissingFiles Exit

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

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

    Если все в порядке, сценарий продолжится. Еще одна подготовка - это псевдоним, который мы будем очень рады иметь позже.

    New-Alias ​​g Get-Random

    Псевдонимы используются для создания альтернативных имен для команд. Они могут быть полезны для ознакомления с новым интерфейсом (например, PowerShell имеет встроенные псевдонимы, такие как dir -> Get-ChildItem а также кот -> 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 имеет значение false или не существует, он будет продолжать циклически проходить через блок скрипта.

    Оператор try принимает пользовательский ввод через Read-Host и пытается преобразовать его в целочисленное значение. (Это [INT] перед Read-Host.) В случае успеха он установит для $ ValidInput значение true, чтобы цикл while мог выйти. В случае неудачи блок catch отправляет сообщение об ошибке, и, поскольку $ ValidInput не был установлен, цикл while будет возвращаться и снова запрашивать пользователя..

    После того, как пользователь правильно указал число в качестве входных данных, мы хотим, чтобы скрипт объявил, что он собирается начать выполнять свою работу, а затем приступил к выполнению этого..

    Write-Host "'nGenerating $ UserInput имен и номеров телефонов. Пожалуйста, будьте терпеливы .'n" 1… $ UserInput | ForEach-Object 

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

    Линия Write-Host довольно проста. Он просто говорит, сколько имен и телефонных номеров собирается сгенерировать скрипт, и просит пользователя набраться терпения, пока скрипт выполняет свою работу.н в начале и конце строки вставлять пустую строку до и после этого вывода, просто чтобы дать ей некоторое визуальное разделение между строкой ввода и списком имен и номеров. Имейте в виду, что это обратный тик (AKA «серьезный акцент» - обычно это клавиша над вкладкой слева от 1), а не апостроф или одиночная кавычка перед каждым N.

    Следующая часть демонстрирует другой способ использования цикла ForEach-Object. Как правило, когда вы хотите, чтобы блок скрипта запускался определенное количество раз, вы устанавливаете регулярный цикл, например for ($ x = 1; $ x -le $ UserInput; $ x ++) . ForEach-Object позволяет нам упростить это, передав ему список целых чисел, и вместо того, чтобы указывать ему что-то делать с этими целыми числами, мы просто даем ему статический блок скрипта для запуска, пока у него не закончатся целые числа, чтобы сделать это для.

    Часть 3: Генерация случайного имени

    Генерация имени - самый простой бит остальной части этого процесса. Он состоит только из трех этапов: выбор фамилии, выбор пола и выбор имени. Помните тот псевдоним, который мы создали для Get-Random некоторое время назад? Время начать использовать это.

        $ Surname = 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" | г

    Первая строка берет наш список фамилий, передает его в случайный инструмент выбора и присваивает выбранное имя $ Surname.

    Вторая строка выбирает пол нашего человека. Помните, как Get-Random начинает считать с нуля, и как ноль ложен, а все остальное верно? Вот как мы используем Get-Random 2 (или намного короче г 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 ' default $ Suffix = "01 $ (g 10) $ (g 10)"

    Из-за специальных правил для 555 номеров мы не можем просто сгенерировать четыре случайные цифры для конца каждого телефонного номера, который собирается создать наш скрипт. Итак, первый переключатель проверяет, имеем ли мы дело с номером 555. Если нет, он генерирует четыре случайные цифры. Если это номер 555, второй коммутатор проверяет код города 800. Если это соответствует, есть только один действительный суффикс $, который мы можем использовать. В противном случае разрешено выбирать что-либо между 0100-0199.

    Обратите внимание, что существует несколько различных способов написания этого блока, а не так, как он есть. Оба оператора switch можно заменить на операторы if / else, поскольку каждый из них обрабатывает только два варианта. Кроме того, вместо того, чтобы специально вызывать «4» в качестве опции для первого оператора switch, «default» можно было использовать аналогично тому, как это было сделано во втором, поскольку это была единственная оставленная опция. Выбор между if / else и switch или использованием ключевого слова по умолчанию вместо конкретных значений часто зависит от личных предпочтений. Пока это работает, используйте то, что вам удобнее всего.

    Теперь пришло время для вывода.

        Запись-вывод "$ FirstName $ Фамилия $ Префикс- $ Суффикс"

    Это довольно просто, как в сценарии. Он просто выводит имя и фамилию через пробел, затем еще один пробел перед номером телефона. Здесь также добавляется стандартная черта между кодом Exchange и идентификатором подписчика.

    Эта закрывающая скобка внизу является концом цикла ForEach-Object ранее - пропустите это, если вы уже получили его.

    Часть 5: Очистка и запуск скрипта

    После того, как вся работа сделана, хороший сценарий знает, как убирать за собой. Снова, удаление переменной ниже действительно не нужно, если вы собираетесь только запустить скрипт из консоли, но вы захотите его, если вы когда-нибудь планируете запустить его в ISE.

    Псевдоним удаленного элемента: \ g Удалить-переменную ScriptFolder, RequiredFiles, Фамилия, Мужской, Имя, Числовой формат, Префикс, Суффикс, ValidInput, UserInput

    После того, как вы все сделали, сохраните скрипт с расширением «.ps1» в той же папке, что и ваши файлы имен. Убедитесь, что ваш ExecutionPolicy настроен так, что скрипт может работать, и поверните его.

    Вот скриншот скрипта в действии:

    Вы также можете скачать ZIP-файл, содержащий этот скрипт PowerShell, и текстовые файлы со списками имен по ссылке ниже.

    Генератор случайных имен и телефонных номеров для PowerShell