10Sep

Como gerar nomes aleatórios e amp;Números de telefone com PowerShell

Quando você precisa de um conjunto de dados para teste ou demonstração, e esse conjunto precisa representar Informações Pessoais Identificáveis ​​(PII), geralmente não deseja usar dados reais que representem pessoas reais. Aqui, nós o seguiremos como você pode usar o PowerShell para gerar uma lista de nomes aleatórios e números de telefone para tal ocasião.

O que você precisa

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

PowerShell

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

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

Nomes

Você precisará de algumas listas de nomes para alimentar o gerador aleatório. Uma ótima fonte para um lot 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 cortá-las um pouco se você planeja gerar muitos nomes e números ao mesmo tempo. Em nosso sistema de teste, cada número de número / número levou cerca de 1,5 segundos para gerar usando as listas completas, mas sua milhagem variará de acordo com as especificações do seu próprio sistema.

  • Sobrenomes
  • Masculino Nome Nomes
  • Primeiros Números Femininos

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

Surnames.txt deve conter os sobrenomes do qual deseja selecionar o script. Exemplo:

Smith Johnson Williams Jones Brown

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

James John Robert Michael William

Females.txt deve conter os nomes femininos dos quais você deseja que o script selecione. Exemplo:

Mary Patricia Linda Barbara Elizabeth

Regras para números de telefone

Se você quer ter certeza de que seus números de telefone não coincidem com o número de telefone real de ninguém, a maneira mais fácil é usar o conhecido Código de Câmbio "555".Mas se você estiver mostrando um conjunto de dados com muitos números de telefone, esse 555 começará a parecer muito monótono e rápido. Para tornar as coisas mais interessantes, geraremos outros números de telefone que violam as regras do NANP( North American Numbering Plan).Abaixo estão alguns exemplos de números de telefone inválidos, que representam 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 um 1 ou 0.
  • ( 298) 731-6185
    Este número é inválido porque a 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 de troca não podem começar com um 1 ou 0.
  • ( 752) 811-1375
    Este número é inválido porque os códigos de troca não podem terminar com dois 1s.
  • ( 265) 555-0128
    Este número é inválido porque o Código de Câmbio é 555, e , o ID do Assinante está dentro do intervalo reservado para números fictícios.
  • ( 800) 555-0199
    Este número é o único número 800 com um 555 Exchange Code 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 ​​à localidade para a 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 mergulhar em realmente escrevê-lo.

  • ForEach-Object possui 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. .. outras declarações permitem que você execute uma operação somente se certas condições forem atendidas e( opcionalmente) especifique o que deve ser feito quando essa condição não for atendida.
  • switch instruções são como declarações com mais escolhas. Switch irá verificar um objeto em várias condições e executar qualquer bloco de script especificado para condições que o objeto corresponda. Você também pode, opcionalmente, especificar um bloco padrão que só será executado se nenhuma outra condição for combinada. 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. Uma vez que algo acontece, isso faz com que a condição não seja mais verdadeira quando o bloco de script for concluído, o loop é encerrado.
  • tenta. .. pegar as instruções ajudam no tratamento de erros. Se alguma coisa der errado com o bloco de script especificado para tentar, o bloco catch será executado.
  • Get-Content 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 da pipeline para ser usado com outros comandos.
  • Write-Host coloca coisas no console. Isso é usado para apresentar mensagens ao usuário e não está incluído na saída do script se a saída for redirecionada.
  • Write-Output realmente gera saída. Normalmente, isso é despejado para o console, mas também pode ser redirecionado por outros comandos.

Existem outros comandos no script, mas vamos explicar aqueles à medida que avançamos.

Construindo o Script

Agora é hora de deixar nossas mãos sujas.

Parte 1: Preparando-se para ir

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

Clear-Host

Agora que temos uma tela limpa, a próxima coisa que queremos fazer é ter a verificação do 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. Ele define uma variável que aponta para a pasta que contém o script. Isso é essencial se o seu script precisar de outros arquivos que estejam localizados no mesmo diretório que ele próprio( ou um caminho relativo conhecido desse diretório), pois você encontrará outros erros se e quando você tentar executar o script enquanto estiver em outrodiretório de trabalho.

A segunda linha cria uma matriz de nomes de arquivos que são necessários para que o script seja executado corretamente. Usaremos isso, juntamente com a variável $ ScriptFolder, na próxima peça em que verificamos se esses arquivos estão presentes.

$ RequiredFiles |ForEach-Object{ if( !( Test-Path "$ ScriptFolder \ $ _")){ Write-Host "$ não encontrado".-ForegroundColor Red $ MissingFiles ++}}

Este 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 é fornecido um caminho de arquivo, retorna uma resposta básica verdadeira ou falsa para nos dizer se o caminho aponta para algo que existe. O ponto de exclamação lá é um operador não , o que inverte a resposta de Test-Path antes de passá-lo para a instrução if. Então, se Test-Path retornar falso( ou seja, o arquivo que procuramos não existe), 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 citações duplas em vez de citações únicas. Quando você coloca algo em citações simples, o PowerShell trata-o como uma string estática. O que quer que seja nas citações simples será passado exatamente como está.Citações duplas dizem ao PowerShell para traduzir as variáveis ​​e alguns outros itens especiais dentro da cadeia antes de passá-la. Aqui, as citações duplas significam que, em vez de executar Test-Path '$ ScriptFolder \ $ _' , estaremos realmente fazendo algo mais como Test-Path 'C: \ Scripts \ Sallames.txt' ( assumindo o seuO script está em C: \ Scripts e ForEach-Object está atualmente trabalhando em 'Surnames.txt').

Para cada arquivo não encontrado, Write-Host publicará uma mensagem de erro em vermelho para dizer qual arquivo está faltando. Em seguida, ele incrementa a variável $ MissingFiles que será usada na próxima peça, para erro e saia se faltaram arquivos.

if( $ MissingFiles){ Write-Host "Não foi possível encontrar $ MissingFiles fonte arquivo( s). Abortando script."-ForegroundColor Red Remove-Variable ScriptFolder, RequiredFiles, MissingFiles Exit}

Aqui está outro truque puro que você pode fazer com instruções if. A maioria dos guias que você verá se as declarações indicarão que você use um operador para verificar se há uma condição correspondente. Por exemplo, aqui podemos usar se( $ 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 onde estávamos usando Test-Path), isso não é necessário. Você também pode fazer sem ele em casos como este, quando você está apenas testando para ver se um número é diferente de zero. Qualquer número não-zero( positivo ou negativo) é tratado como verdadeiro, enquanto zero( ou, como pode acontecer aqui, uma variável inexistente) será tratado como falso.

Se $ MissingFiles existe e não é zero, Write-Host publicará uma mensagem informando o número de arquivos que faltam e que o script irá abortar. Então, Remove-Variable irá limpar todas as variáveis ​​que criamos e Exit irá encerrar o script. No console regular do PowerShell, Remove-Variable não é realmente necessário para este propósito específico porque as variáveis ​​estabelecidas pelos scripts são normalmente descartadas quando o script é encerrado. No entanto, o PowerShell ISE comporta-se um pouco diferente, então você pode querer manter isso dentro se você planeja executar o script a partir daí.

Se todas as coisas estiverem em ordem, o script continuará.Mais uma preparação a fazer é um alias que teremos muito prazer em ter mais tarde.

New-Alias ​​g Get-Random

Os alias são usados ​​para criar nomes alternativos para comandos. Estes podem ser úteis para nos ajudar a familiarizar-se com a nova interface( por exemplo: o PowerShell possui alias incorporados como dir - & gt; Get-ChildItem e cat - & gt; Get-Content ) ou para fazer referências curtaspara comandos comumente usados. Aqui, estamos fazendo uma muito referência de mão curta para Get-Random comando que será usado muito mais tarde.

Get-Random praticamente o que seu nome implica. Dada uma matriz( como uma lista de nomes) como entrada, ele escolhe um item aleatório da matriz e o escuta. Também pode ser usado para gerar números aleatórios. O que lembrar sobre Get-Random e números é que, como muitas outras operações de computador, começa a contar de zero. Então, em vez de Get-Random 10 significando o mais natural "me dê um número de 1 a 10" significa realmente "me dê um número de 0 a 9." Você pode ser mais específico sobre a seleção do número, de modo que Get-Random se comporta mais como você naturalmente esperaria, mas não precisamos disso neste script.

Parte 2: Obter entrada do usuário e começar a trabalhar

Enquanto um script que gera apenas um nome e amp;o número de telefone é ótimo, é muito melhor se o script permitir ao usuário especificar quantos nomes e amp;números que eles querem entrar em um lote. Infelizmente, nós realmente não podemos confiar nos usuários para sempre dar uma entrada válida. Então, há um pouco mais para isso do que apenas $ UserInput = Read-Host .

enquanto( ! $ ValidInput){ try{ [int] $ UserInput = Read-Host -Prompt 'Itens a serem gerados' $ ValidInput = $ true} catch{ Write-Host 'Entrada inválida. Digite apenas um número.-ForegroundColor Vermelho}}

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

A declaração de tentativa leva a entrada do usuário, via Read-Host, e tenta convertê-lo em um valor inteiro.(Isso é [int] antes do Read-Host.) Se for bem-sucedido, ele ajustará $ ValidInput como verdadeiro para que o loop while possa sair. Se não for bem sucedido, o bloco catch bloqueia um erro e, porque $ ValidInput não foi configurado, o loop while retornará e solicitará ao usuário novamente.

Uma vez que o usuário tenha dado corretamente um número como entrada, queremos que o script anuncie que está prestes a começar realmente fazendo seu trabalho e, em seguida, começar a fazê-lo.

Write-Host "` nGenerando $ UserInput nomes e números de telefone. Seja paciente.`n "1. . $ UserInput |ForEach-Object{ & lt; # INSERT RANDOM NAME &NUMBER GENERATOR AQUI # & gt;}

Não se preocupe, não vamos deixar você sozinho para descobrir o nome aleatório e amp;código do gerador de números. Esse é apenas um comentário de espaço reservado para mostrar onde a próxima seção( onde o trabalho real é feito) vai se encaixar.

A linha Write-Host é bastante direta. 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 `n no início e no final da string é inserir uma linha em branco antes e depois dessa saída, apenas para dar-lhe alguma separação visual entre a linha de entrada e a lista de nomes e amp;números. Esteja ciente de que isso é um back-tick( AKA "acento grave" - ​​geralmente a aba da tecla acima, à esquerda de 1) e não um apóstrofo ou uma citação única na frente de cada n .

A próxima parte mostra uma maneira diferente de usar um loop ForEach-Object. Normalmente, quando você quer um bloco de script para executar um certo número de vezes, você configurará um loop regular como para( $ x = 1; $ x -le $ UserInput; $ x ++){ & lt; # INSERT SCRIPTAQUI # & gt;}. ForEach-Object nos permite simplificar isso, fornecendo-lhe uma lista de inteiros e, ao invés de dizer-lhe para realmente fazer qualquer coisa com esses inteiros, apenas lhe damos um bloco de script estático para executar até que ele seja executado sem números inteiros para fazê-lo.

Parte 3: gerando um nome aleatório

Gerar o nome é o bit mais simples do resto desse processo. Consiste apenas em três etapas: escolher um sobrenome, escolher um gênero e escolher um primeiro nome. Lembre-se de que alias nós fizemos Get-Random algum tempo atrás? Hora de começar a usar isso.

$ Sobrenome = Get-Content "$ ScriptFolder \ Sallames.txt" |g $ Masculino = g 2 se( $ Masculino){ $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" |g} else{ $ FirstName = Get-Content "$ ScriptFolder \ Females.txt" |g}

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

A segunda linha escolhe o gênero de nossa pessoa. Lembre-se de como Get-Random começa a contar de zero, e como zero é falso e tudo o mais é verdade?É assim que estamos usando o Get-Random 2 ( ou o g 2 muito mais curto graças ao nosso alias - 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 posteriormente escolha aleatoriamente um nome masculino ou feminino em conformidade.

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

Aqui está a parte muito divertida. Mais cedo, mostramos como existem várias maneiras de fazer um número de telefone inválido ou fictício. Uma vez que não queremos que todos os nossos números se parecem muito parecidos um com o outro, escolheremos aleatoriamente um formato de número inválido sempre. Os formatos escolhidos aleatoriamente serão definidos pelo Código de Área e o Código de Câmbio, que serão coletivamente armazenados como $ Prefixo.

$ 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 diretos para escolher qual formatovamos seguir o número de telefone. Em seguida, a declaração de mudança leva essa escolha aleatória e gera um prefixo de $ em conformidade. Lembre-se da lista de tipos de números de telefone inválidos? Os valores $ NumberFormat 0-3 correspondem aos quatro primeiros dessa lista. O valor 4 pode gerar um dos dois últimos, uma vez que ambos usam o código de troca "555".

Aqui, você também pode ver que estamos usando outro truque com aspas duplas. Cotações duplas não permitem que você interprete variáveis ​​antes que uma string obtenha saída - eles também permitem que você processe blocos de script. Para fazer isso, você envolve o bloco de script como este: "$( & lt; #SCRIPT AQUI # & gt;)" .Então, o que você tem acima é um monte de dígitos aleatorizados individualmente, com alguns deles limitados em seu alcance ou configurados estaticamente de acordo com as regras que precisamos seguir. Cada string também possui parênteses e espaçamentos, como normalmente esperaria ver em um par de código de área e código de câmbio.

A última coisa que precisamos fazer antes de estar pronto para produzir nosso nome e amp;número de telefone é gerar uma ID de Assinante, que será armazenada como $ Suffix. Comutador

( $ NumberFormat){ {$ _ -lt 4}{ $ Suffix = "$( g 10) $( g 10) $( g 10) $( g 10)"} 4{ switch( $ Prefix){ '(800) 555 '{$ Suffix =' 0199 '} padrão{ $ Suffix = "01 $( g 10) $( g 10)"}}}}}

Devido às regras especiais para 555 números, não podemos apenasgere quatro dígitos aleatórios para o final de cada número de telefone que o nosso script fará.Então, o primeiro controle verifica se estamos lidando com um número 555.Caso contrário, ele gera quatro dígitos aleatórios. Se for um número 555, o segundo parâmetro verifica o código de área 800.Se isso corresponder, existe apenas um Suffix $ válido que podemos usar. Caso contrário, é permitido escolher entre qualquer coisa entre 0100-0199.

Observe que existem algumas formas diferentes de bloquear este bloco, em vez do caminho. As duas declarações de troca poderiam ter sido substituídas por instruções if / else, uma vez que cada uma delas apenas lida com duas opções. Além disso, ao invés de chamar especificamente "4" como uma opção para a primeira instrução de mudança, o "padrão" poderia ter sido usado de forma semelhante ao feito no segundo, pois era a única opção restante. A escolha entre if / else vs. switch, ou onde usar a palavra-chave padrão em vez de valores específicos, muitas vezes se resume a uma questão de preferência pessoal. Enquanto isso, use o que você estiver mais confortável.

Agora, é hora de saída.

Write-Output "$ Primeiro Nome $ Sobrenome $ Prefixo- $ Sufixo"}

Este é praticamente tão simples quanto obtém no script. Ele apenas exibe o primeiro e último nome separados por espaços, depois outro espaço antes do número de telefone. Aqui é onde a guia padrão entre o Código de Câmbio e a ID do Assinante é adicionada também.

Esse suporte de fechamento na parte inferior é o fim do loop ForEach-Object anterior - omita isso se você já o obteve.

Parte 5: Limpeza e execução do script

Depois de todo o trabalho estar pronto, um bom script sabe como limpar depois de si mesmo. Novamente, a remoção de variáveis ​​abaixo não é realmente necessária se você apenas executando o script do console, mas você vai querer isso se você planeja executá-lo no ISE.

Remove-Item alias: \ g Remove-Variable ScriptFolder, RequiredFiles, Sobrenome, Masculino, FirstName, NumberFormat, Prefixo, Sufixo, ValidInput, UserInput

Depois de concluir tudo, salve o script com uma extensão ".ps1"na mesma pasta que os arquivos dos seus nomes. Certifique-se de que o seu ExecutionPolicy esteja configurado para que o script possa ser executado e dar um giro.

Aqui está 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, a partir do link abaixo.

Random Name &Gerador de números de telefone para PowerShell