Como gerar nomes aleatórios e números de telefone com o PowerShell

Índice:

Como gerar nomes aleatórios e números de telefone com o PowerShell
Como gerar nomes aleatórios e números de telefone com o PowerShell

Vídeo: Como gerar nomes aleatórios e números de telefone com o PowerShell

Vídeo: Como gerar nomes aleatórios e números de telefone com o PowerShell
Vídeo: Preparando um computador velho para se tornar um servidor de arquivos e mídia - Parte 2 - YouTube 2024, Abril
Anonim
Quando você precisa de um conjunto de dados para teste ou demonstração, e esse conjunto precisa representar informações pessoalmente identificáveis (PII), geralmente você não deseja usar dados reais que representem pessoas reais. Aqui, mostraremos como você pode usar o PowerShell para gerar uma lista de nomes aleatórios e números de telefone exatamente para essa ocasião.
Quando você precisa de um conjunto de dados para teste ou demonstração, e esse conjunto precisa representar informações pessoalmente identificáveis (PII), geralmente você não deseja usar dados reais que representem pessoas reais. Aqui, mostraremos como você pode usar o PowerShell para gerar uma lista de nomes aleatórios e números de telefone exatamente para essa ocasião.

O que você precisa

Antes de começar, existem algumas ferramentas e informações que você deve ter:

PowerShell

Esse script foi desenvolvido usando o PowerShell 4.0 e também foi testado quanto à compatibilidade com o PowerShell 2.0. O PowerShell 2.0 ou posterior foi incorporado ao Windows desde o Windows 7. Ele também está disponível para o Windows XP e o Vista como parte do Windows Management Framework (WMF). Alguns detalhes adicionais e links para downloads estão abaixo.

  • O PowerShell 2.0 é fornecido com o Windows 7. Os usuários do Windows XP SP3 e Vista (SP1 ou posterior) podem baixar a versão WMF apropriada da Microsoft em KB968929. Não é suportado no XP SP2 ou inferior, ou no Vista sem o SP1.
  • O PowerShell 4.0 vem com o Windows 8.1. Os usuários do Windows 7 SP1 podem atualizar para ele como parte de uma atualização do WMF no Centro de Download da Microsoft. Não está disponível para o XP ou o Vista.

Nomes

Você precisará de algumas listas de nomes para alimentar o gerador aleatório. Uma ótima fonte para um muito de nomes e informações sobre sua popularidade (embora isso não seja usado para este script), é o United States Census Bureau. As listas disponíveis nos links abaixo são muito grandes, então você pode querer reduzi-las um pouco se planeja gerar muitos nomes e números de uma só vez. Em nosso sistema de teste, cada par nome / número levou cerca de 1,5 segundos para gerar usando as listas completas, mas sua milhagem irá variar dependendo das especificações do sistema.

  • Sobrenomes
  • Nomes Masculinos
  • Nomes femininos

Independentemente da fonte usada, você precisará gerar três arquivos de texto que o script pode usar como pools para a seleção de nomes. Cada arquivo deve conter apenas nomes e apenas um nome por linha. Eles precisam ser armazenados na mesma pasta do script do PowerShell.

Sobrenome deve conter os sobrenomes que você deseja que o script selecione. Exemplo:

Smith Johnson Williams Jones Brown

Males.txt deve conter os primeiros nomes masculinos dos quais você deseja que o script seja selecionado. Exemplo:

James John Robert Michael William

Fêmeas.txt deve conter os nomes próprios que você deseja que o script selecione. Exemplo:

Mary Patricia Linda Barbara Elizabeth

Regras para números de telefone

Se você quiser ter certeza de que seus números de telefone não correspondem ao número de telefone real de alguém, a maneira mais fácil é usar o conhecido código "555" do Exchange. Mas se você exibir um conjunto de dados com muitos números de telefone, o 555 começará a parecer bem monótono e rápido. Para tornar as coisas mais interessantes, geramos outros números de telefone que violam as regras do Plano de Numeração da América do Norte (NANP). Abaixo estão alguns exemplos de números de telefone inválidos, representando cada classe de número que será gerada por este script:

  • (157) 836-8167 Este número é inválido porque os códigos de área não podem começar com 1 ou 0.
  • (298) 731-6185 Este número é inválido porque o NANP não está atribuindo códigos de área com 9 como o segundo dígito.
  • (678) 035-7598 Este número é inválido porque os códigos do Exchange não podem começar com 1 ou 0.
  • (752) 811-1375 Este número é inválido porque os códigos do Exchange não podem terminar com dois 1s.
  • (265) 555-0128 Este número é inválido porque o código do Exchange é 555, e o ID do Assinante está dentro do intervalo reservado para números fictícios.
  • (800) 555-0199 Esse número é o único número 800 com um Código do Exchange 555, que é reservado para uso como um número fictício.

Observe que as regras acima estão sujeitas a alterações e podem variar de acordo com a jurisdição. Você deve fazer sua própria pesquisa para verificar as regras atuais que são aplicáveis ao local para o qual você estará gerando números de telefone.

Comandos Comuns

Existem alguns comandos bastante comuns que serão usados ao longo deste script, então você deve ter uma idéia básica do que isso significa antes de mergulharmos em escrevê-lo.

  • ForEach-Object pega uma matriz ou lista de objetos e executa a operação especificada em cada um deles. Dentro de um bloco de script ForEach-Object, a variável $ _ é usada para se referir ao item atual que está sendo processado.
  • se … mais As declarações permitem que você execute uma operação somente se determinadas condições forem atendidas e (opcionalmente) especifique o que deve ser feito quando essa condição não for atendida.
  • interruptor instruções são como se declarações com mais opções. O switch verificará um objeto em várias condições e executará os blocos de script especificados para as condições com as quais o objeto corresponde. Você também pode, opcionalmente, especificar um bloco padrão que será executado somente se nenhuma outra condição for correspondida. As instruções switch também usam a variável $ _ para se referir ao item atual que está sendo processado.
  • enquanto As instruções permitem que você repita continuamente um bloco de script, desde que uma determinada condição seja atendida. Quando algo acontece que faz com que a condição não seja mais verdadeira quando o bloco de script é concluído, o loop é encerrado.
  • tente … pegar instruções ajudam na manipulação de erros. Se algo der errado com o bloco de script especificado para try, o bloco catch será executado.
  • Obter conteudo Faz o que diz na lata.Obtém o conteúdo de um objeto especificado - geralmente um arquivo. Isso pode ser usado para exibir o conteúdo de um arquivo de texto no console ou, como neste script, passar o conteúdo ao longo do pipeline para ser usado com outros comandos.
  • Anfitrião de gravação coloca coisas no console. Isso é usado para apresentar mensagens ao usuário e não é incluído na saída do script se a saída for redirecionada.
  • Write-Output na verdade gera saída. Normalmente, isso é despejado no console, mas também pode ser redirecionado por outros comandos.

Existem outros comandos no script, mas vamos explicá-los à medida que avançamos.

Construindo o Script

Agora é hora de sujarmos as mãos.

Parte 1: Preparando-se para ir

Se você gosta do seu script para começar a usar um console limpo, aqui está a primeira linha que você deseja.

Clear-Host

Agora que temos uma tela limpa, a próxima coisa que queremos fazer é verificar o script para garantir que tudo o que precisa está no lugar. Para fazer isso, precisamos começar dizendo onde procurar e o que procurar.

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

A primeira linha é muito útil para qualquer script. Define uma variável que aponta para a pasta que contém o script. Isso é essencial se o script precisar de outros arquivos localizados no mesmo diretório que ele (ou um caminho relativo conhecido desse diretório), pois, caso contrário, você encontrará erros se e quando tentar executar o script enquanto estiver em outra. diretório de trabalho.

A segunda linha cria uma matriz de nomes de arquivos necessários para o script ser executado corretamente. Nós usaremos isso, junto com a variável $ ScriptFolder, na próxima parte em que verificarmos se esses arquivos estão presentes.

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

Esse pedaço de script envia a matriz $ RequiredFiles para um bloco ForEach-Object. Dentro desse bloco de script, a instrução if usa o Test-Path para ver se o arquivo que procuramos é onde ele pertence. Test-Path é um comando simples que, quando recebe um caminho de arquivo, retorna uma resposta básica, verdadeira ou falsa, para nos informar se o caminho aponta para algo que existe. O ponto de exclamação lá é um não operador, que inverte a resposta do Test-Path antes de passá-lo para a instrução if. Portanto, se o caminho de teste retornar false (ou seja, o arquivo que estamos procurando não existir), ele será convertido em verdadeiro para que a instrução if execute seu bloco de script.

Outra coisa a notar aqui, que será usada frequentemente neste script, é o uso de aspas duplas em vez de aspas simples. Quando você coloca algo entre aspas simples, o PowerShell a trata como uma string estática. O que quer que esteja nas aspas simples será passado exatamente como está. As aspas duplas informam ao PowerShell para converter as variáveis e alguns outros itens especiais na sequência antes de transmiti-la. Aqui, as aspas duplas significam que, em vez de correr Caminho de teste "$ ScriptFolder $ _" nós vamos realmente estar fazendo algo mais como Caminho de teste "C: Scripts Apelidos.txt" (supondo que seu script esteja em C: Scripts e ForEach-Object esteja atualmente trabalhando em "Surname.txt").

Para cada arquivo não encontrado, o Write-Host postará uma mensagem de erro em vermelho para informar qual arquivo está faltando. Em seguida, ele incrementa a variável $ MissingFiles, que será usada na próxima parte, para erro e será encerrada se houver arquivos faltando.

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

Aqui está outro truque que você pode fazer com instruções if. A maioria das guias que você verá sobre as instruções if dirão para você usar um operador para verificar uma condição correspondente. Por exemplo, aqui podemos usar if ($ MissingFiles -gt 0) para ver se $ MissingFiles é maior que zero. No entanto, se você já estiver usando comandos que retornam um valor booleano (como no bloco anterior em que estávamos usando o Caminho de teste), isso não é necessário. Você também pode passar sem isso em casos como esse, quando você está apenas testando para ver se um número é diferente de zero. Qualquer número diferente de zero (positivo ou negativo) é tratado como verdadeiro, enquanto zero (ou, como pode acontecer aqui, uma variável inexistente) será tratado como falso.

Se $ MissingFiles existir e for diferente de zero, o Write-Host publicará uma mensagem informando quantos arquivos estavam faltando e que o script será interrompido. Em seguida, Remove-Variable limpará todas as variáveis que criamos e Sair sairá do script. No console normal do PowerShell, Remove-Variable não é realmente necessário para essa finalidade específica, pois as variáveis definidas pelos scripts normalmente são descartadas quando o script é encerrado. No entanto, o PowerShell ISE se comporta de maneira um pouco diferente, portanto, convém mantê-lo se você planeja executar o script a partir dele.

Se tudo estiver em ordem, o script continuará. Mais uma preparação para fazer é um alias que ficaremos muito felizes em ter mais tarde.

New-Alias g Get-Random

Os aliases são usados para criar nomes alternativos para comandos. Isso pode ser útil para nos ajudar a conhecer a nova interface (por exemplo, o PowerShell possui aliases internos como dir -> Get-ChildItem e cat -> Get-Content) ou para fazer referências curtas para comandos comumente usados. Aqui estamos fazendo um muito referência de mão curta para o Get-Random comando que vai ser usado muito mais tarde.

Get-Random praticamente faz o que o nome sugere. Dado um array (como uma lista de nomes) como entrada, ele seleciona um item aleatório do array e o cospe. Também pode ser usado para gerar números aleatórios. A coisa a lembrar sobre Get-Random e números é que, como muitas outras operações de computador, começa a contar a partir de zero. Então, ao invés de Get-Random 10 ou seja, quanto mais natural "me dê um número de 1 a 10", isso realmente significa "me dê um número de 0 a 9." Você pode ser mais específico sobre a seleção de números, para que Get-Random se comporte mais naturalmente espere, mas não precisaremos disso nesse script.

Parte 2: Obtendo a entrada do usuário e chegando ao trabalho

Embora um script que gere apenas um nome aleatório e número de telefone seja ótimo, é muito melhor se o script permitir que o usuário especifique quantos nomes e números deseja obter em um lote. Infelizmente, não podemos confiar nos usuários para sempre fornecer informações válidas. Então, há um pouquinho mais nisso do que apenas $ UserInput = Read-Host.

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 } }

A instrução while acima verifica e nega o valor de $ ValidInput. Contanto que $ ValidInput seja falso, ou não exista, ele continuará circulando através de seu bloco de script.

A instrução try pega a entrada do usuário, via Read-Host, e tenta convertê-lo em um valor inteiro. (Esse é o [int] antes do Read-Host.) Se for bem-sucedido, definirá $ ValidInput como true para que o loop while possa sair. Se não for bem-sucedido, o bloco catch registrará um erro e, como $ ValidInput não foi definido, o loop while retornará e avisará o usuário novamente.

Depois que o usuário inserir um número corretamente como entrada, queremos que o script anuncie que está prestes a começar a funcionar e, em seguida, começar a fazer isso.

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

Não se preocupe, não vamos deixá-lo sozinho para descobrir o nome aleatório e o código do gerador de números. Isso é apenas um comentário de espaço reservado para mostrar onde a próxima seção (onde o trabalho real é realizado) vai se encaixar.

A linha Write-Host é bem direta. Ele simplesmente diz quantos nomes e números de telefone o script vai gerar e pede ao usuário que seja paciente enquanto o script faz seu trabalho. o`nno início e no final da cadeia é inserir uma linha em branco antes e depois da saída, apenas para dar uma separação visual entre a linha de entrada e a lista de nomes e números. Esteja ciente de que é um back-tick (AKA, "sotaque grave" - geralmente a tecla acima da guia, à esquerda de 1) e não um apóstrofo ou aspas simples na frente de cada n.

A próxima parte mostra uma maneira diferente de usar um loop ForEach-Object. Normalmente, quando você deseja que um bloco de script seja executado um certo número de vezes, você configura um loop regular como para ($ x = 1; $ x -le $ UserInput; $ x ++) {<# INSERIR SCRIPT AQUI #>}.ForEach-Object nos permite simplificar isso alimentando uma lista de números inteiros e, em vez de dizer a ele para realmente fazer qualquer coisa com esses números inteiros, apenas damos a ele um bloco de script estático para ser executado até que ele fique sem inteiros para isso.

Parte 3: Gerando um Nome Aleatório

Gerar o nome é a parte mais simples do restante desse processo. Consiste apenas em três etapas: escolher um sobrenome, escolher um sexo e escolher um primeiro nome. Lembra daquele apelido que fizemos para a Get-Random algum tempo atrás? Hora de começar a usar isso.

$Surname = Get-Content '$ScriptFolderSurnames.txt' | g $Male = g 2 if ($Male) {$FirstName = Get-Content '$ScriptFolderMales.txt' | g} else {$FirstName = Get-Content '$ScriptFolderFemales.txt' | g}

A primeira linha pega nossa lista de sobrenomes, alimenta-a no seletor aleatório e atribui o nome escolhido a $ Sobrenome.

A segunda linha escolhe o sexo da pessoa. Lembre-se de como o Get-Random começa a contar a partir do zero e como zero é falso e tudo o mais é verdadeiro? É assim que estamos usando Get-Random 2 (ou o mais curto g 2 graças ao nosso apelido - ambos resultam em uma escolha entre zero ou um) para decidir se a nossa pessoa é do sexo masculino ou não. A instrução if / else escolhe aleatoriamente um nome próprio masculino ou feminino de acordo com isso.

Parte 4: Gerando um número de telefone aleatório

Aqui está a parte realmente divertida. Anteriormente, mostramos a você como há várias maneiras de criar um número de telefone inválido ou fictício. Como não queremos que todos os nossos números pareçam muito semelhantes entre si, escolheremos aleatoriamente um formato de número inválido todas as vezes. Os formatos escolhidos aleatoriamente serão definidos pelo código de área e pelo código do Exchange, que serão coletivamente armazenados como $ Prefix.

$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'} }

A primeira linha é uma geração de números aleatórios simples para escolher o formato que seguiremos para o número de telefone. Então, a instrução switch pega essa escolha aleatória e gera um $ Prefix correspondente. Lembre-se dessa lista de tipos de números de telefone inválidos? Os valores $ NumberFormat 0-3 correspondem aos quatro primeiros da lista. O valor 4 pode gerar um dos dois últimos, já que ambos usam o Código do Exchange “555”.

Aqui, você também pode ver que estamos usando outro truque com aspas duplas. Aspas duplas não permitem apenas que você interprete variáveis antes que uma sequência seja gerada - elas também permitem processar blocos de script. Para fazer isso, você quebra o bloco de script assim: “$ (<# SCRIPT AQUI #>)”. Então, o que você tem acima é um monte de dígitos aleatórios individualmente, com alguns deles limitados ou ajustados estaticamente de acordo com as regras que precisamos seguir. Cada string também tem parênteses e espaçamento, como você normalmente esperaria ver em um par de código de área e código do Exchange.

A última coisa que precisamos fazer antes de estarmos prontos para gerar nosso nome e número de telefone é gerar um ID de Assinante, que será armazenado como $ Sufixo.

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)'} } } }

Por causa das regras especiais para 555 números, não podemos gerar apenas quatro dígitos aleatórios para o final de cada número de telefone que nosso script vai fazer. Então, o primeiro switch verifica se estamos lidando com um número 555. Caso contrário, gera quatro dígitos aleatórios. Se for um número 555, o segundo switch verifica o código de área 800.Se isso corresponder, há apenas um Sufixo $ válido que podemos usar. Caso contrário, é permitido escolher entre 0100-0199.

Note que existem algumas maneiras diferentes que este bloco poderia ter sido escrito, em vez de como é. Ambas as instruções de troca podem ter sido substituídas por declarações if / else, já que cada uma delas manipula apenas duas opções. Além disso, em vez de chamar especificamente “4” como uma opção para a primeira instrução switch, “default” poderia ter sido usado de forma semelhante ao que foi feito na segunda vez que era a única opção que restava. A escolha entre if / else vs. switch, ou onde usar a palavra-chave padrão em vez de valores específicos, geralmente se resume a uma questão de preferência pessoal. Enquanto isso funcionar, use o que for mais confortável para você.

Agora é hora de saída.

Write-Output '$FirstName $Surname $Prefix-$Suffix' }

Este é praticamente tão simples quanto no script. Apenas exibe o primeiro e último nome separados por espaços, depois outro espaço antes do número de telefone. Veja onde o traço padrão entre o Código do Exchange e o ID do Assinante também é adicionado.

Esse colchete de fechamento na parte inferior é o final do loop ForEach-Object anterior - omita isso se você já o tiver recebido.

Parte 5: Limpar e executar o script

Depois de todo o trabalho estar concluído, um bom script sabe como limpar a si mesmo. Novamente, a remoção de variável abaixo não é realmente necessária se você for executar o script apenas no console, mas você o desejará se planeja executá-lo no ISE.

Remove-Item alias:g Remove-Variable ScriptFolder,RequiredFiles,Surname,Male,FirstName,NumberFormat,Prefix,Suffix,ValidInput,UserInput

Depois de concluir tudo, salve o script com uma extensão ".ps1" na mesma pasta dos arquivos de nomes. Certifique-se de que sua ExecutionPolicy esteja definida para que o script possa ser executado e dê um giro.

Veja uma captura de tela do script em ação:

Você também pode baixar um arquivo ZIP contendo este script do PowerShell e arquivos de texto com listas de nomes, no link abaixo.
Você também pode baixar um arquivo ZIP contendo este script do PowerShell e arquivos de texto com listas de nomes, no link abaixo.

Nome aleatório e gerador de números de telefone para o PowerShell

Recomendado: