Генерация случайных имён и номеров телефонов с помощью 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
BrownMales.txt — пример:
James
John
Robert
Michael
WilliamFemales.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: Подготовка
Очистим экран и зададим переменные окружения.
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-текст переведён и уточнён):
Ссылка на 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 цифры телефонного номера. ## Короткое резюме - Этот скрипт помогает безопасно генерировать тестовые пары имён и телефонных номеров. - Используйте локализацию для корректных форматов номеров в вашей юрисдикции. - Применяйте оптимизации, если объёмы генерации большие. - Помечайте и изолируйте тестовые данные для соответствия политикам безопасности. Важное: всегда валидируйте локальные правила нумерации и политику обработки персональных данных перед массовым использованием скрипта.
Похожие материалы
Родительский контроль на Android TV
Ошибка 30068 при установке Office — как исправить
Проверка: готов ли ПК к VR
iMessage на Windows 11 — методы и инструкция
Переименовать Android TV — быстрый гайд