Гид по технологиям

Генерация случайных имён и номеров телефонов с помощью PowerShell

9 min read Инструменты Обновлено 01 Dec 2025
Генерация имён и телефонов в PowerShell
Генерация имён и телефонов в PowerShell

Быстрые ссылки

  • Что потребуется
  • PowerShell и совместимость
  • Списки имён
  • Правила для телефонных номеров (NANP)
  • Общие команды, используемые в скрипте
  • Построение скрипта — по частям
  • Часть 1: Подготовка
  • Часть 2: Ввод от пользователя и запуск
  • Часть 3: Генерация случайного имени
  • Часть 4: Генерация случайного номера телефона
  • Часть 5: Очистка и запуск
  • Отладка, тесты и критерии приёмки
  • Альтернативы и варианты для локализации
  • Чек-листы ролей и безопасность

Введение

Когда нужен набор данных для тестирования или демонстрации, и этот набор должен выглядеть как персональные данные (PII), не следует использовать реальные данные реальных людей. Этот материал покажет, как с помощью PowerShell генерировать списки случайных имён и фиктивных телефонных номеров. Скрипт ориентирован на создание удобочитаемых строк «Имя Фамилия Номер», где номера намеренно выбиваются из правил NANP, чтобы снизить риск совпадения с настоящими номерами.

Важно: алгоритмы и правила нумерации со временем меняются. Перед использованием в конкретной локали проверьте применимые правила и нормативы.

Что потребуется

  • Windows с PowerShell (см. раздел совместимости ниже).
  • Три текстовых файла в одной папке со скриптом:
    • Males.txt — по одной мужской имени на строку
    • Females.txt — по одной женской имени на строку
    • Surnames.txt — по одной фамилии на строку
  • Разрешение запуска скриптов (ExecutionPolicy), если требуется.

Файлы должны содержать только названия (без дополнительных метаданных), по одному имени на строке.

PowerShell и совместимость

Скрипт разработан для PowerShell 4.0 и совместим с PowerShell 2.0. Краткие факты о совместимости:

  • PowerShell 2.0 поставляется с Windows 7. Для Windows XP SP3 и Vista (SP1+) можно установить Windows Management Framework из KB968929. Не поддерживается на XP SP2 и ниже.
  • PowerShell 4.0 входит в комплект поставки Windows 8.1. Для Windows 7 SP1 можно установить WMF-обновление из центра загрузки Microsoft.

Совет: при запуске в PowerShell ISE некоторые переменные сохраняются после завершения скрипта — очистка переменных в конце скрипта полезна для ISE.

Списки имён

Источники, например списки переписи населения США, содержат большие наборы имён. Для генерации большого количества пар имён/номеров вы можете усечь списки до удобного размера.

Примеры формата: каждый файл по одному имени в строке.

Surnames.txt — пример содержания (каждое имя с новой строки):

Smith
Johnson
Williams
Jones
Brown

Males.txt — пример:

James
John
Robert
Michael
William

Females.txt — пример:

Mary
Patricia
Linda
Barbara
Elizabeth

Разместите эти файлы в той же папке, где будет .ps1 файл со скриптом.

Правила для телефонных номеров (NANP) — краткая справка

Цель: создавать номера, которые выглядят как телефонные номера, но с низким риском совпадения с реальными. Для зон NANP (США, Канада и т. п.) полезно знать ключевые ограничения, чтобы искусственно нарушать их:

  • Код региона (Area Code) не должен начинаться с 0 или 1.
  • Второй символ кодов региона не должен быть 9 (в традиционных правилах NANP многие коды с 9 во втором символе не используются).
  • Код обмена (Exchange Code) не должен начинаться с 0 или 1.
  • Некоторые обмены (например, 555) зарезервированы для вымышленных номеров; их использование допустимо, но надо соблюдать дополнительные ограничения для идентификатора абонента (Suffix).

Примеры типов невалидных/фигуральных номеров, которые генерирует скрипт (для иллюстрации):

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

Примечание: Правила меняются и могут отличаться в других юрисдикциях — проведите локальную проверку перед массовой генерацией.

Общие команды, используемые в скрипте — короткая шпаргалка

  • ForEach-Object — выполняет блок для каждого элемента коллекции; в блоке текущий элемент доступен как $_.
  • if … else — стандартная условная конструкция.
  • switch — многоветвевой выбор, использует $_ как текущий объект внутри.
  • while — цикл при выполнении условия.
  • try … catch — обработка ошибок.
  • Get-Content — читает содержимое файла (по умолчанию построчно при выводе в конвейер).
  • Write-Host — выводит текст в консоль, не попадает в перенаправленный вывод.
  • Write-Output — генерирует вывод, который можно перенаправить или сохранить.
  • Test-Path — проверяет существование файла или пути.
  • Split-Path — извлекает путь к папке скрипта.
  • New-Alias — создаёт псевдоним команды.

Понимание этих команд поможет понять скрипт поблочно.

Построение скрипта — общий обзор процесса

Скрипт делится на логические блоки:

  1. Подготовка окружения: очистка консоли, определение папки со скриптом, проверка наличия входных файлов.
  2. Ввод от пользователя: запрос количества записей, валидация ввода.
  3. Главный цикл: для каждой записи — сформировать случайное имя и фиктивный номер.
  4. Очистка: удалить алиасы и временные переменные при необходимости.

Далее — полная поэтапная разбивка с кодом и объяснениями.

Часть 1: Подготовка

Очистим экран и зададим переменные окружения.

Clear-Host

Определим папку, где находится скрипт, и список требуемых файлов:

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

Пояснение: Split-Path с $MyInvocation используется, чтобы скрипт корректно находил файлы, даже если его запустили из другой рабочей папки.

Проверим наличие файлов и соберём счётчик отсутствующих:

$RequiredFiles | ForEach-Object {
    if (!(Test-Path "$ScriptFolder\$_")) { Write-Host "$_ not found." -ForegroundColor Red; $MissingFiles++ }
}

Если есть пропущенные файлы — прервём выполнение:

if ($MissingFiles)
{ Write-Host "Could not find $MissingFiles source file(s). Aborting script." -ForegroundColor Red; Remove-Variable ScriptFolder,RequiredFiles,MissingFiles; Exit }

Создадим короткий алиас для Get-Random — это сделает код более компактным:

New-Alias g Get-Random

Объяснение: g 2 вернёт 0 или 1 — удобно для выбора между двумя состояниями (мужчина/женщина).

Важно: не удаляйте файл с алиасом вручную; в конце скрипта мы удалим его корректно.

Часть 2: Ввод от пользователя и запуск

Запросим у пользователя количество требуемых записей и отвалидируем ввод:

while (!$ValidInput)
{ try { [int]$UserInput = Read-Host -Prompt 'Items to be generated'; $ValidInput = $true } catch { Write-Host 'Invalid input. Enter a number only.' -ForegroundColor Red } }

После успешного ввода выведем сообщение о старте и запустим основной цикл:

Write-Host "`nGenerating $UserInput names & phone numbers. Please be patient.`n"
1..$UserInput | ForEach-Object { <# INSERT RANDOM NAME & NUMBER GENERATOR HERE #> }

Примечание по синтаксису: `n — это backtick + n, используемый в PowerShell для новой строки внутри строки. ## Часть 3: Генерация случайного имени Логика: выбрать случайную фамилию, случайно выбрать пол, затем взять случайное имя соответствующего пола. Фрагмент, который следует вставить в основной цикл: powershell $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" | g} Пояснение: Get-Content возвращает все строки файла в виде массива; передача в g (Get-Random) выбирает одну случайную строку. g 2 даёт 0 или 1; в PowerShell 0 воспринимается как false, остальные значения как true. Совет производительности: при очень большом количестве итераций имеет смысл загрузить файлы в память за пределами цикла (в массивы $Surnames, $Males, $Females) и потом выбирать из них, чтобы избежать повторного чтения файлов каждый раз. Пример оптимизации (рекомендуется для больших $UserInput): powershell $Surnames = Get-Content "$ScriptFolder\Surnames.txt" $Males = Get-Content "$ScriptFolder\Males.txt" $Females = Get-Content "$ScriptFolder\Females.txt" # В цикле затем использовать: $Surname = $Surnames | g ; $FirstName = $Males | g или $Females | g ## Часть 4: Генерация случайного номера телефона Задача: каждый номер должен выглядеть как телефонный, но быть маловероятно реальным. Скрипт выбирает один из форматов нарушения правил и формирует префикс (Area Code + Exchange Code), а затем суффикс (Subscriber ID). Форматирование префиксов реализовано так: powershell $NumberFormat = g 5 switch ($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"} } Разбор форматов: - 0 — AreaCode начинается с 0/1 (недопустимо), создаёт вид «явно вымышленного» кода. - 1 — AreaCode имеет 9 в середине (некоторые коды с 9 не используются). - 2 — Exchange Code начинается с 0/1 (недопустимо). - 3 — Exchange Code кончается на 11 (специфическое нарушение). - 4 — Exchange Code равен 555 — требует отдельной обработки нижних четырёх цифр. Далее формируем суффикс (последние четыре цифры): powershell 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)"} } } } Объяснение: - Для форматов 0–3 генерируем четыре случайные цифры. - Для формата с 555 учитываем, что 800/555 имеет особый зарезервированный суффикс 0199; для прочих 555 разрешён диапазон 0100–0199, поэтому генерируем 01xx. Наконец, выводим строку: powershell Write-Output "$FirstName $Surname $Prefix-$Suffix" Если вы использовали оптимизацию чтения файлов в память, вставляйте соответствующие переменные ($Surnames, $Males, $Females). ## Часть 5: Очистка и запуск Удалим временный алиас и переменные (полезно для PowerShell ISE): powershell Remove-Item alias:\g Remove-Variable ScriptFolder,RequiredFiles,Surname,Male,FirstName,NumberFormat,Prefix,Suffix,ValidInput,UserInput Сохраните скрипт с расширением .ps1 в ту же папку, где находятся текстовые файлы. Проверьте ExecutionPolicy командой Get-ExecutionPolicy и при необходимости используйте Set-ExecutionPolicy RemoteSigned или Bypass для локальной тестовой машины (только если вы понимаете риски). Ниже два изображения из исходной статьи сохранены как есть (только alt-текст переведён и уточнён): Изображение: обложка — генерация случайных имён и номеров с PowerShell Скриншот: пример вывода скрипта в консоли PowerShell Ссылка на ZIP-архив со скриптом и файлами имён можно поместить рядом с этой статьёй (в исходном материале присутствовала ссылка для скачивания). ## Практические советы и оптимизации - Производительность: при генерации больших объёмов (тысячи записей) загрузите файлы имён в массивы вне цикла и используйте их как источники для Get-Random. Чтение файлов в каждой итерации значительно замедляет работу. - Разделение ответственности: выделите логику генерации имени и логику генерации номера в отдельные функции — так проще тестировать и переиспользовать код. - Логи: при генерации данных для тестирования полезно сохранять результаты в CSV-файл через Export-Csv или в текстовый файл через Out-File/Set-Content. - Идентифицируемость: если нужно быстро отличать тестовые записи от настоящих, добавляйте в формат метку (например, фамилия начинающаяся на “Test“) или префикс в телефонном номере. Пример экспорта в CSV (вставьте в главный цикл или соберите массив объектов): powershell # Внутри цикла можно создавать объект и добавлять в массив $Results $Results += [PSCustomObject]@{FirstName=$FirstName; Surname=$Surname; Phone="$Prefix-$Suffix"} # После цикла: $Results | Export-Csv -Path "$ScriptFolder\generated.csv" -NoTypeInformation -Encoding UTF8 ## Отладка — распространённые ошибки и решения - “Could not find … source file(s)”: проверьте папку скрипта и наличие файлов с точными именами (учитывается регистр в некоторых средах). - Проблемы с ExecutionPolicy: временно используйте PowerShell с запуском как администратор и Set-ExecutionPolicy Bypass -Scope Process. - Неожиданные символы в файлах имён: проверьте кодировку файлов — UTF-8 без BOM предпочтительнее для переносимости. - Медленная генерация при больших объёмах: см. раздел оптимизаций. ## Тестовые случаи и критерии приёмки Критерии приёмки (минимум): 1. Скрипт корректно завершает работу при отсутствии одного из файлов с понятным сообщением. 2. При вводе нечислового значения скрипт просит повторить ввод. 3. Для заданного N генерируются ровно N строк в выходном потоке. 4. Строки имеют формат “Имя Фамилия (XXX) YYY-ZZZZ” и не выбрасывают ошибок выполнения. 5. При использовании 555 префикса соблюдены правила формирования суффикса (800/555 -> 0199, прочие -> 01xx). Тест-кейсы (пара примеров): - Тест 1: Запустить с $UserInput = 1, проверить формат вывода и отсутствие исключений. - Тест 2: Удалить Females.txt и запустить — ожидается сообщение об ошибке и выход скрипта. - Тест 3: Ввести строку “abc” на запрос количества — ожидается сообщение об ошибке и повторный запрос. - Тест 4: Запустить с $UserInput = 1000 и замерить время; при слишком долгом выполнении применить оптимизацию чтения файлов в память. Критерии приёмки для QA: все тесты пройдены, создан лог выполнения и экспортированы результаты (если требовалось). ## Альтернативные подходы 1. Использовать специализированные библиотеки генерации фиктивных данных (например Faker для Python/JS) — они предоставляют локализованные имена, адреса и номера телефонов. 2. Генерировать имена и номера в базе данных (с помощью SQL-скриптов) для массовой загрузки тестовых данных. 3. Использовать PowerShell с модулем PSSQLite или другими модулями для интеграции с источниками данных. Плюсы PowerShell: простота запуска на Windows, отсутствие дополнительных зависимостей. Минусы: возможности локализации и гибкости по сравнению со специализированными библиотеками ограничены. ## Локализация и местные альтернативы (для России и СНГ) - В локальных тестовых наборах целесообразно использовать списки имён и фамилий, характерные для региона (русские имена, фамилии с типичными окончаниями). - Номера телефонов в России не подчиняются NANP — генерация фиктивных российских номеров требует другой логики: используйте диапазоны, которые не принадлежат реальным операторам или помечайте номера как тестовые. Не используйте реальные диапазоны операторов без проверки. - Формат номера: для России обычно +7 (XXX) XXX-XX-XX. При генерации указывайте код страны и формат суффикса соответствующим образом. Пример генерации российского фиктивного номера (мини-код для замены блока формирования префикса/суффикса): powershell # Пример: +7 (9XX) XXX-XX-XX — но избегайте действительных диапазонов операторов $Operator = 9$(g 10)$(g 10) # простая генерация оператора вида 9XY $Local = "$(g 10)$(g 10)$(g 10)-$(g 10)$(g 10)-$(g 10)$(g 10)" # не идеально, но для примера $Phone = "+7 ($Operator) $Local" Важно: проверьте местные правила и избегайте совпадений с реальными абонентами. ## Чек-листы ролей Разработчик: - [ ] Разместил Males.txt, Females.txt, Surnames.txt в папке со скриптом - [ ] Убедился, что кодировка файлов — UTF-8 - [ ] Оптимизировал чтение файлов при необходимости Тестировщик: - [ ] Проверил валидацию ввода - [ ] Запустил тест-кейсы из раздела тестов - [ ] Проверил экспорт результатов (CSV / файл) Администратор: - [ ] Проверил ExecutionPolicy на тестовой машине - [ ] Запустил скрипт в безопасном окружении - [ ] Убедился, что тестовые номера помечены как фиктивные ## Безопасность, приватность и соответствие требованиям - Генерируемые данные являются фиктивными, но при их использовании в тестовой среде всё равно соблюдайте политику безопасности и приватности организации. - Не загружайте сгенерированные данные в продуктивные базы, которые могут смешаться с реальными PII. - Для соответствия регламентам (GDPR и пр.) помечайте тестовые наборы и храните их в изолированном хранилище. ## Профиль зрелости для генерации тестовых данных (микровзгляд) - Уровень 0 — ручная генерация с копированием строк в текстовый файл. - Уровень 1 — единственный скрипт PowerShell, как в этой статье, генерация в консоль. - Уровень 2 — экспорт в CSV/JSON, базовая валидация и логирование. - Уровень 3 — интеграция с системами тестирования, параметризация и ротация данных. - Уровень 4 — централизованный менеджер данных для тестирования с маскированием, SLA и аудитом. Переходите по уровням, если ваши требования к качеству и безопасности растут. ## Ментальные модели и эвристики - Степень риска = вероятность совпадения × влияние. Уменьшайте вероятность (генерация, нарушающая локальные правила нумерации) и помечайте данные, чтобы снизить влияние. - Простота обслуживания = читаемость кода + документированность. Разбивайте на функции. - Локализация — не только имена, но и форматы телефонов, кодировка и ожидания тестовых сценариев. ## Маленькая методология: шаги при внедрении скрипта в процесс тестирования 1. Создать и верифицировать файлы имён. 2. Запустить скрипт в безопасной среде с малым N и проверить формат вывода. 3. Добавить экспорт в CSV и создать контрольную выборку. 4. Провести ревью безопасности и пометить данные как тестовые. 5. Включить скрипт в CI/CD или качать вручную в зависимости от потребностей. ## Шаблон отчёта о запуске (короткий) - Дата/время запуска: __ - Пользователь: __ - Количество записей: __ - Файлы имён: (перечислить) - Экспорт: (CSV/JSON/нет) - Замечания/ошибки: _ ## Глоссарий — одна строка для ключевых терминов - PII — персональные данные, которые могут идентифицировать человека. - NANP — North American Numbering Plan, правила телефонной нумерации для США/Канады и др. - Exchange Code — трёхзначная часть номера, следующая после кода региона. - Subscriber ID (Suffix) — последние 4 цифры телефонного номера. ## Короткое резюме - Этот скрипт помогает безопасно генерировать тестовые пары имён и телефонных номеров. - Используйте локализацию для корректных форматов номеров в вашей юрисдикции. - Применяйте оптимизации, если объёмы генерации большие. - Помечайте и изолируйте тестовые данные для соответствия политикам безопасности. Важное: всегда валидируйте локальные правила нумерации и политику обработки персональных данных перед массовым использованием скрипта.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Родительский контроль на Android TV
Инструкции

Родительский контроль на Android TV

Ошибка 30068 при установке Office — как исправить
Техподдержка

Ошибка 30068 при установке Office — как исправить

Проверка: готов ли ПК к VR
Железо

Проверка: готов ли ПК к VR

iMessage на Windows 11 — методы и инструкция
Руководство

iMessage на Windows 11 — методы и инструкция

Переименовать Android TV — быстрый гайд
Гайды

Переименовать Android TV — быстрый гайд

Как вернуть деньги от неплательщика: практическое руководство
Фриланс

Как вернуть деньги от неплательщика: практическое руководство