Как генерировать случайные имена и номера телефонов с помощью 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 должен содержать фамилии, из которых вы хотите выбрать скрипт. Пример:

 Smith
Джонсон
Williams
Джонс
Brown 

Males.txt должен содержать имена мужчин, из которых вы хотите выбрать сценарий. Пример:

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

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

 Mary
Патриция
Линда
Барбара
Элизабет 

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

Если вы хотите убедиться, что ваши телефонные номера не совпадают с чьими-либо реальными телефонными номерами, самый простой способ — использовать хорошо известный «555» код обмена. Но если вы собираетесь показывать набор данных с большим количеством телефонных номеров, этот 555 начнет выглядеть довольно монотонно очень быстро. Чтобы сделать вещи более интересными, мы создадим другие телефонные номера, которые нарушают правила Североамериканского плана нумерации (NANP). Ниже приведен пример недопустимых телефонных номеров, представляющих каждый класс номеров, которые будут сгенерированы этим сценарием:

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

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

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

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

  • ForEach-Object принимает массив или список объектов и выполняет указанную операцию для каждого из них. В блоке сценария ForEach-Object переменная $ _ используется для ссылки на текущий обрабатываемый элемент.
  • Операторы if… else позволяют выполнять операцию только при соблюдении определенных условий и (необязательно) указывать, что следует делать, если это условие не выполняется.
  • Операторы switch похожи на операторы if с большим выбором. Switch проверит объект на соответствие нескольким условиям и запустит любые блоки скриптов, указанные для условий, которые соответствуют объекту. Вы также можете, по желанию, указать блок по умолчанию, который будет запускаться только в том случае, если не найдены другие условия. Операторы Switch также используют переменную $ _ для ссылки на текущий обрабатываемый элемент.
  • Операторы while позволяют вам непрерывно повторять блок скрипта, пока выполняется определенное условие. Когда происходит что-то, что приводит к тому, что условие перестает быть истинным после завершения блока скрипта, цикл завершается.
  • Операторы try… catch помогают в обработке ошибок. Если что-то пойдет не так с блоком сценария, указанным для try, блок catch запустится.
  • Get-Content делает то, что говорит на банке. Он получает содержимое указанного объекта — обычно файла. Это может использоваться для отображения содержимого текстового файла на консоли или, как в этом сценарии, для передачи содержимого по конвейеру для использования с другими командами.
  • Write-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 — это простая команда, которая при задании пути к файлу возвращает базовый ответ истины или ложи, чтобы сообщить нам, указывает ли путь на что-то существующее. Восклицательный знак содержит оператор not , который переворачивает ответ Test-Path перед передачей его в оператор if. Таким образом, если Test-Path возвращает false (то есть искомый файл не существует), он будет преобразован в true, чтобы оператор if выполнял свой блок скрипта.

Еще одна вещь, которую следует отметить здесь, которая будет часто использоваться в этом сценарии, это использование двойных кавычек вместо одинарных кавычек. Когда вы помещаете что-либо в одинарные кавычки, PowerShell обрабатывает это как статическую строку. Все, что есть в одинарных кавычках, будет передано точно так, как есть. Двойные кавычки говорят PowerShell переводить переменные и некоторые другие специальные элементы в строке перед ее передачей. Здесь двойные кавычки означают, что вместо запуска Test-Path ‘$ ScriptFolder \ $ _’ мы на самом деле будем делать что-то более похожее на Test-Path ‘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
Выход
} 

Вот еще один изящный трюк, который вы можете сделать с помощью операторов 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 и cat -> Get-Content ) или сделать краткие ссылки для часто используемых команд. Здесь мы создаем очень краткую ссылку для команды Get-Random , которая будет использоваться намного позже.

Get-Random в значительной степени делает то, что подразумевает его название. Учитывая массив (например, список имен) в качестве входных данных, он выбирает случайный элемент из массива и выплевывает его. Он также может быть использован для генерации случайных чисел. Что нужно помнить о Get-Random и числах, так это то, что, как и многие другие компьютерные операции, он начинает считать с нуля. Таким образом, вместо Get-Random 10 , означающего более естественное «дайте мне число от 1 до 10», на самом деле это означает «дайте мне число от 0 до 9.». Вы можете быть более точным в отношении числа selection, так что Get-Random ведет себя больше, чем вы ожидаете, но в этом сценарии это нам не понадобится.

Часть 2. Получение пользовательского ввода и начало работы

Хотя сценарий, который генерирует только одно случайное имя и номер телефона, великолепен, гораздо лучше, если сценарий позволяет пользователю указать, сколько имен и номеров они хотят получить в одном пакете. К сожалению, мы не можем доверять пользователям, чтобы они всегда предоставляли действительные данные. Таким образом, в этом есть нечто большее, чем просто $ UserInput = Read-Host .

 while (! $ ValidInput)
{
пытаться
{
[int] $ UserInput = Read-Host -Prompt 'Элементы, которые будут сгенерированы'
$ ValidInput = $ true
}
ловить
{
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 довольно проста. Он просто говорит, сколько имен и телефонных номеров собирается сгенерировать скрипт, и просит пользователя набраться терпения, пока скрипт выполняет свою работу. `n в начале и конце строки состоит в том, чтобы вставить пустую строку до и после этого вывода, просто чтобы дать ей некоторое визуальное разделение между строкой ввода и списком имен и номеров. Имейте в виду, что это обратная галочка (AKA «серьезный акцент» — обычно это клавиша над вкладкой слева от 1), а не апостроф или одиночная кавычка перед каждым n .

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

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

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

 $ Surname = Get-Content "$ ScriptFolder \ Surnames.txt" | г
$ Мужской = г 2
if ($ Male)
$ FirstName = Get-Content "$ ScriptFolder \ Males.txt"
еще
 г 

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

Во второй строке указывается пол нашего человека. Помните, как 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».

Здесь вы также можете увидеть, что мы используем другой трюк с двойными кавычками. Двойные кавычки не просто позволяют вам интерпретировать переменные до того, как строка получит вывод — они также позволяют обрабатывать блоки скриптов. Для этого вы оберните блок скрипта следующим образом: «$ ()» . Итак, у вас есть много индивидуально рандомизированных цифр, причем некоторые из них либо ограничены в своем диапазоне, либо установлены статически в соответствии с правилами, которым мы должны следовать. Каждая строка также имеет круглые скобки и интервалы, как вы обычно ожидаете увидеть в паре Код города и Код обмена.

Последнее, что нам нужно сделать, прежде чем мы будем готовы вывести наше имя и номер телефона, — это сгенерировать идентификатор подписчика, который будет храниться как $ Suffix.

переключатель

 ($ NumberFormat)
{
{$ _ -lt 4} {$ Suffix = "$ (g 10) $ (g 10) $ (g 10) $ (g 10)"}
4 {
переключатель (префикс $)
{
'(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.

 псевдоним Remove-Item: \ g
Переменная Remove-Variable ScriptFolder, RequiredFiles, Фамилия, Мужской, FirstName, NumberFormat, Префикс, Суффикс, ValidInput, UserInput 

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

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

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

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

Оцените статью
TutoryBird.Ru
Добавить комментарий