Como gerar nomes aleatórios e números de telefone com o PowerShell
Quando você precisa de um conjunto de dados para teste ou demonstração e esse conjunto precisa representar as Informações Pessoais 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 para essa ocasião.
O que você precisa
Antes de começar, há 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 Windows XP e 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 diminuí-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 que o seu 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 primeiros nomes femininos 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 bem conhecido código "555" do Exchange. Mas se você estiver mostrando 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, geraremos outros números de telefone que violem 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 aplicáveis à localidade para a qual você gerará 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 escrever isso..
- 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 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 correspondentes ao objeto. 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 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 explicar isso à medida que formos.
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 correr a partir de um console limpo, aqui está a primeira linha que você deseja nele.
Limpar 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 = Dividir Caminho $ MyInvocation.MyCommand.Definition -Parent $ RequiredFiles = ('Males.txt', 'Females.txt', 'Surname.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 mesmo (ou um caminho relativo conhecido desse diretório), porque, 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 onde verificamos se esses arquivos estão presentes.
$ RequiredFiles | ForEach-Object if (! (Caminho de teste "$ 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 estamos procurando é 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 falso (isto é, 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 parecido Caminho de Teste 'C: \ Scripts \ Apelidos.txt' (supondo que seu script está em C: \ Scripts e ForEach-Object está atualmente trabalhando em 'Apelido.txt').
Para cada arquivo não encontrado, o Write-Host publicará 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 ausentes.
if ($ MissingFiles) Write-Host "Não foi possível encontrar o (s) arquivo (s) de origem $ MissingFiles. Abortando o script." -ForegroundColor Vermelho Remove-Variable ScriptFolder, RequiredFiles, MissingFiles Sair
Aqui está outro truque que você pode fazer com instruções if. A maioria dos guias que você verá sobre as instruções if dirão a você para 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 Test-Path), isso não é necessário. Você também pode passar sem isso em casos como esse, quando 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 de lá..
Se tudo estiver em ordem, o script continuará. Mais uma preparação para fazer é um apelido que ficaremos muito felizes em ter mais tarde.
Novo-Alias g Get-Random
Os aliases 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 tem alias incorporados 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. O que devemos 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 realmente 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 = Ler-Host -Prompt 'Itens a serem gerados' $ ValidInput = $ true catch Write-Host 'Entrada inválida. Digite apenas um número. -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á em loop por meio 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, ele configurará $ 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.
Uma vez que o usuário forneceu corretamente um número como entrada, queremos que o script anuncie que ele está prestes a começar a fazer seu trabalho e, em seguida, começar a fazê-lo..
Write-Host "nGenerando $ UserInput nomes e números de telefone. Por favor, seja paciente.'n" 1 ... $ UserInput | ForEach-Object
Não se preocupe, não vamos deixá-lo por conta própria 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 é feito) vai se encaixar.
A linha Write-Host é bastante simples. 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. on no início e no final da cadeia é inserir uma linha em branco antes e depois da saída, apenas para fornecer 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 chave acima 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 ++) . 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 inteiros, nós apenas damos a ele um bloco de script estático para ser executado até que ele fique sem inteiros para fazer 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. Lembre-se que o apelido que fizemos para Get-Random algum tempo atrás? Hora de começar a colocar isso em uso.
$ Surname = Get-Content "$ ScriptFolder \ Apelidos.txt" | g $ Masculino = g 2 if ($ Male) $ FirstName = Obter Conteúdo "$ ScriptFolder \ Males.txt" | g else $ FirstName = Obter conteúdo "$ ScriptFolder \ Females.txt" | g
A primeira linha pega nossa lista de sobrenomes, alimenta-a no selecionador aleatório e atribui o nome escolhido a $ sobrenome.
A segunda linha escolhe o sexo da nossa pessoa. Lembre-se de como o Get-Random começa a contar a partir de zero, e como zero é falso e todo o resto é 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.
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 fazer um número de telefone inválido ou fictício. Como não queremos que todos os 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.
Interruptor $ NumberFormat = g 5 ($ NumberFormat) 0 $ Prefix = "($ (g 2) $ (g 10) $ (g 10)) $ (g 10) $ (g 10) $ (g 10)" 1 $ Prefixo = "($ (g 10) 9 $ (g 10)) $ (g 10) $ (g 10) $ (g 10)" 2 $ Prefixo = "($ (g 10) $ (g 10) $ (g 10)) $ (g 2) $ (g 10) $ (g 10) " 3 $ Prefixo =" ($ (g 10) $ (g 10) $ (g 10)) $ (g 10) 11 " 4 $ Prefixo =" ($ (g 10) $ (g 10) $ (g 10)) 555 "
A primeira linha é uma geração de números aleatórios simples para escolher o formato que vamos seguir 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, pois ambos usam o código "555" do Exchange.
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 string seja gerada - elas também permitem que você processe blocos de script. Para fazer isso, você quebra o bloco de script assim: "$ ()". Então, o que você tem acima é um monte de dígitos aleatórios individualmente, com alguns deles limitados em seu alcance ou definidos 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 Código de Área e Código de Troca..
A última coisa que precisamos fazer antes de estarmos prontos para produzir nosso nome e número de telefone é gerar um ID de Assinante, que será armazenado como $ Sufixo..
switch ($ NumberFormat) $ _ -lt4 $ Suffix = "$ (g 10) $ (g 10) $ (g 10) $ (g 10)" 4 troca (prefixo $) '( 800) 555 '$ Suffix =' 0199 ' padrão $ Suffix = "01 $ (g 10) $ (g 10)"
Por causa das regras especiais para números 555, não podemos apenas gerar 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 qualquer coisa entre 0100-0199.
Note que existem algumas maneiras diferentes que este bloco poderia ter sido escrito, em vez de como é. Ambas as instruções switch podem ter sido substituídas por declarações if / else, já que cada uma delas apenas manipula 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 você estiver mais confortável com.
Agora é hora da saída.
Saída de Gravação "$ FirstName $ Surname $ Prefix- $ Suffix"
Este é praticamente tão simples quanto entra no roteiro. Apenas mostra o primeiro e último nome separados por espaços, depois outro espaço antes do número de telefone. É aqui que o traço padrão entre o Código do Exchange e o ID do Assinante é adicionado também.
Esse colchete de fechamento na parte inferior é o final do loop ForEach-Object anterior - omita isso se você já o tiver.
Parte 5: Limpar e executar o script
Depois de todo o trabalho estar terminado, um bom script sabe como limpar a si mesmo. Novamente, a remoção da variável abaixo não é realmente necessária se você for executar o script apenas a partir do console, mas você o desejará se planeja executá-lo no ISE.
Alias Remove-Item: \ g Remove-Variable ScriptFolder, RequiredFiles, Apelido, Masculino, Nome, NumberFormat, Prefixo, Sufixo, 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 configurada para que o script possa ser executado e forneça 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, no link abaixo.
Nome aleatório e gerador de números de telefone para o PowerShell