10Sep
Cuando necesita un conjunto de datos para pruebas o demostraciones, y ese conjunto necesita representar información de identificación personal( PII), generalmente no desea utilizar datos reales que representen personas reales. Aquí, le mostraremos cómo puede usar PowerShell para generar una lista de nombres aleatorios y números de teléfono para dicha ocasión.
Lo que necesita
Antes de comenzar, hay algunas herramientas e información que debe tener:
PowerShell
Este script se desarrolló con PowerShell 4.0 y también se ha probado su compatibilidad con PowerShell 2.0.PowerShell 2.0 o posterior ha sido incorporado a Windows desde Windows 7. También está disponible para Windows XP y Vista como parte del Windows Management Framework( WMF).Algunos detalles adicionales y enlaces para descargas están a continuación.
- PowerShell 2.0 viene con Windows 7. Los usuarios de Windows XP SP3 y Vista( SP1 o posterior) pueden descargar la versión WMF adecuada de Microsoft en KB968929.No es compatible con XP SP2 o inferior, o Vista sin SP1.
- PowerShell 4.0 viene con Windows 8.1.Los usuarios de Windows 7 SP1 pueden actualizarlo como parte de una actualización de WMF desde el Centro de descarga de Microsoft. No está disponible para XP o Vista.
Nombres
Necesitará algunas listas de nombres para alimentar al generador aleatorio. Una gran fuente para un lote de nombres, y la información con respecto a su popularidad( aunque eso no se utilizará para este script), es la Oficina del Censo de los Estados Unidos. Las listas disponibles en los siguientes enlaces son muy grandes, por lo que es posible que desee recortarlas un poco si planea generar muchos nombres y números a la vez. En nuestro sistema de prueba, cada par de nombre / número tomó aproximadamente 1,5 segundos para generar usando las listas completas, pero su millaje variará dependiendo de las especificaciones de su propio sistema.
- Apellidos
- Nombres masculinos
- Nombres femeninos
Independientemente de la fuente que utilice, deberá generar tres archivos de texto que la secuencia de comandos pueda usar como conjuntos para la selección del nombre. Cada archivo debe contener solo nombres, y solo un nombre por línea. Deben almacenarse en la misma carpeta que su script de PowerShell.
Apellidos.txt debe contener los apellidos que desea que seleccione el script. Ejemplo:
Smith Johnson Williams Jones BrownMales.txt debe contener los nombres masculinos que desea que seleccione el script. Ejemplo:
James John Robert MichaelFemales.txt debe contener los nombres femeninos que desea que seleccione el guión. Ejemplo:
Mary Patricia Linda Barbara ElizabethReglas para números de teléfono
Si quiere asegurarse de que sus números de teléfono no concuerden con el número de teléfono real de alguien, la forma más fácil es usar el conocido Código de Intercambio "555".Pero si va a mostrar un conjunto de datos con muchos números de teléfono, ese 555 comenzará a parecer bastante monótono muy rápido. Para hacer las cosas más interesantes, generaremos otros números de teléfono que infrinjan las reglas del Plan de numeración de América del Norte( NANP).A continuación hay algunos ejemplos de números de teléfono no válidos, que representan cada clase de número que se generará con este script:
- ( 157) 836-8167
Este número no es válido porque los códigos de área no pueden comenzar con 1 o 0. - ( 298) 731-6185
Este número no es válido porque el NANP no está asignando códigos de área con 9 como segundo dígito. - ( 678) 035-7598
Este número no es válido porque los códigos de Exchange no pueden comenzar con 1 o 0. - ( 752) 811-1375
Este número no es válido porque los códigos de Exchange no pueden finalizar con dos 1s. - ( 265) 555-0128
Este número no es válido porque el código de Exchange es 555, y , la ID del suscriptor está dentro del rango reservado para números ficticios. - ( 800) 555-0199
Este número es el único número 800 con un Código de Intercambio 555 que está reservado para su uso como un número ficticio.
Tenga en cuenta que las reglas anteriores están sujetas a cambios y pueden variar según la jurisdicción. Debe hacer su propia investigación para verificar las reglas actuales que son aplicables a la localidad para la que generará números de teléfono. Comandos comunes
Hay algunos comandos bastante comunes que se utilizarán a lo largo de este script, por lo que debe tener una idea básica de lo que significan antes de sumergirnos en escribirlo.
- ForEach-Object toma una matriz o lista de objetos y realiza la operación especificada en cada uno de ellos. Dentro de un bloque de script ForEach-Object, la variable $ _ se usa para referirse al elemento actual que se está procesando.
- if. .. else _Las declaraciones de le permiten realizar una operación solo si se cumplen ciertas condiciones y( opcionalmente) especificar qué se debe hacer cuando no se cumple esa condición. Conmutador
- Las instrucciones son como si las declaraciones con más opciones. Switch verificará un objeto contra varias condiciones y ejecutará los bloques de script especificados para las condiciones que el objeto coincida. También puede, opcionalmente, especificar un bloque predeterminado que solo se ejecutará si no se cumplen otras condiciones. Las sentencias Switch también usan la variable $ _ para referirse al elemento actual que se está procesando.
- , mientras que las sentencias le permiten repetir continuamente un bloque de script siempre que se cumpla una determinada condición. Una vez que ocurre algo que hace que la condición ya no sea verdadera cuando el bloque de scripts finaliza, el bucle finaliza.
- intenta. .. capturar declaraciones ayuda con el manejo de errores. Si algo sale mal con el bloque de script especificado para try, se ejecutará el bloque catch.
- Get-Content hace lo que dice en la lata. Obtiene el contenido de un objeto específico, generalmente un archivo. Esto se puede usar para mostrar los contenidos de un archivo de texto en la consola o, como en este script, pasar los contenidos a lo largo de la canalización para usarlos con otros comandos.
- Write-Host pone cosas en la consola. Esto se usa para presentar mensajes al usuario y no se incluye en el resultado del script si se redirecciona la salida.
- Write-Output en realidad genera salida. Normalmente, esto se descarga a la consola, pero también puede ser redirigido por otros comandos.
Hay otros comandos en el script, pero los explicaremos a medida que avancemos.
Construyendo la secuencia de comandos
Ahora es el momento de ensuciarnos las manos.
Parte 1: Preparándose para ir
Si le gusta que su script comience a ejecutarse desde una consola limpia, aquí está la primera línea que quiere.
Clear-HostAhora que tenemos una pantalla limpia, lo siguiente que queremos hacer es verificar el script para asegurarnos de que todo lo que necesita esté en su lugar. Para hacer eso, debemos comenzar diciéndole dónde buscar y qué buscar.
$ ScriptFolder = Split-Path $ MyInvocation. MyCommand. Definition -Prent $ RequiredFiles =( 'Males.txt', 'Females.txt', 'Apellidos.txt')La primera línea es muy útil para cualquier script. Define una variable que apunta a la carpeta que contiene el script. Esto es esencial si su script necesita otros archivos que se encuentran en el mismo directorio que él( o una ruta relativa conocida de ese directorio), porque de lo contrario encontrará errores si intenta ejecutar el script mientras está en otrodirectorio de trabajo.
La segunda línea crea una matriz de nombres de archivo necesarios para que la secuencia de comandos se ejecute correctamente. Usaremos esto, junto con la variable $ ScriptFolder, en la siguiente pieza donde verificamos para estar seguros de que esos archivos están presentes.
$ RequiredFiles |ForEach-Object{ if( !( Test-Path "$ ScriptFolder \ $ _")){ Write-Host "$ _ no encontrado".-ForegroundColor Red $ MissingFiles ++}}Este fragmento de script envía la matriz $ RequiredFiles a un bloque ForEach-Object. Dentro de ese bloque de script, la instrucción if usa Test-Path para ver si el archivo que estamos buscando es el que pertenece. Test-Path es un comando simple que, cuando se le da una ruta de archivo, devuelve una respuesta verdadera o falsa básica para decirnos si la ruta apunta a algo que existe. El signo de admiración es un operador no , que invierte la respuesta de Test-Path antes de pasarlo a la instrucción if. Entonces, si Test-Path devuelve falso( es decir, el archivo que estamos buscando no existe), se convertirá en verdadero para que la instrucción if ejecute su bloque de script.
Otra cosa a tener en cuenta aquí, que se utilizará a menudo en este script, es el uso de comillas dobles en lugar de comillas simples. Cuando coloca algo entre comillas simples, PowerShell lo trata como una cadena estática. Lo que está en las comillas simples se transmitirá exactamente como está.Las comillas dobles le dicen a PowerShell que traduzca las variables y algunos otros elementos especiales dentro de la cadena antes de pasarla. Aquí, las comillas dobles significan que en lugar de ejecutar Test-Path '$ ScriptFolder \ $ _' , en realidad vamos a hacer algo más parecido a Test-Path 'C: \ Scripts \ Apellidos.txt' ( suponiendo queel script está en C: \ Scripts, y ForEach-Object actualmente está trabajando en 'Apellidos.txt').
Por cada archivo no encontrado, Write-Host publicará un mensaje de error en rojo para indicarle qué archivo falta. A continuación, incrementa la variable $ MissingFiles que se utilizará en la siguiente pieza, a error y salga si faltan algunos archivos.
if( $ MissingFiles){ Write-Host "No se pudo encontrar $ MissingFiles archivo( s) de origen. Abortar script".-ForegroundColor Red Remove-Variable ScriptFolder, RequiredFiles, MissingFiles Exit}Este es otro buen truco que puede hacer con las declaraciones if. La mayoría de las guías que verá si las declaraciones le indicarán que use un operador para verificar una condición coincidente. Por ejemplo, aquí podríamos usar if( $ MissingFiles -gt 0) para ver si $ MissingFiles es mayor que cero. Sin embargo, si ya está utilizando comandos que devuelven un valor booleano( como en el bloque anterior en el que utilizamos Test-Path) eso no es necesario. También puede prescindir de él en casos como este, cuando solo está probando para ver si un número no es cero. Cualquier número distinto de cero( positivo o negativo) se trata como verdadero, mientras que cero( o, como puede suceder aquí, una variable inexistente) se tratará como falso.
Si $ MissingFiles existe, y no es cero, Write-Host publicará un mensaje que le indicará cuántos archivos faltaban y que la secuencia de comandos se cancelará.Luego, Remove-Variable limpiará todas las variables que hemos creado y Exit abandonará el script. En la consola de PowerShell normal, Remove-Variable no es realmente necesario para este propósito en particular porque las variables establecidas por las secuencias de comandos normalmente se descartan cuando sale la secuencia de comandos. Sin embargo, el ISE de PowerShell se comporta de una manera un tanto diferente, por lo que es posible que desee conservarlo si planea ejecutar el script desde allí.
Si todo está en orden, la secuencia de comandos continuará.Una preparación más para hacer es un alias que estaremos muy contentos de tener más adelante.
New-Alias g Los alias Get-Randomse usan para crear nombres alternativos para los comandos. Estos pueden ser útiles para ayudarnos a familiarizarnos con la nueva interfaz( por ejemplo: PowerShell tiene alias incorporados como dir - & gt; Get-ChildItem y cat - & gt; Get-Content ) o para hacer referencias abreviadaspara comandos comúnmente utilizados. Aquí, estamos haciendo una muy referencia de mano corta para el Get-Random comando que va a ser utilizado mucho más adelante.
Get-Random hace lo que su nombre implica. Dada una matriz( como una lista de nombres) como entrada, selecciona un elemento aleatorio de la matriz y lo escupe. También se puede usar para generar números aleatorios. Sin embargo, lo que hay que recordar sobre Get-Random y números es que, al igual que muchas otras operaciones de computadora, empieza a contar desde cero. Entonces, en lugar de Get-Random 10 significa que cuanto más natural "dame un número del 1 al 10" realmente significa "dame un número del 0 al 9." Puedes ser más específico sobre la selección del número, de modo que-Random se comporta más como usted esperaría naturalmente, pero no necesitaremos eso en este guión.
, parte 2: obtener entrada de usuario y ponerse a trabajar
, mientras que una secuencia de comandos que genera un solo nombre al azar &El número de teléfono es excelente, es mucho mejor si la secuencia de comandos permite al usuario especificar cuántos nombres &números que quieren obtener en un lote. Desafortunadamente, no podemos confiar en que los usuarios den siempre una entrada válida. Entonces, hay un poco más de esto que solo $ UserInput = Read-Host .
while( ! $ ValidInput){ try{ [int] $ UserInput = Read-Host -Prompt 'Elementos que se van a generar' $ ValidInput = $ true} catch{ Write-Host 'Entrada no válida. Introduce solo un número. '-ForegroundColor Red}}La instrucción while anterior comprueba y niega el valor de $ ValidInput. Siempre que $ ValidInput sea falso o no exista, continuará recorriendo su bloque de script.
La declaración try toma la entrada del usuario, a través de Read-Host, e intenta convertirlo a un valor entero.(Ese es el [int] antes de Read-Host.) Si tiene éxito, establecerá $ ValidInput en verdadero para que el ciclo while pueda salir. Si no tiene éxito, el bloque catch publica un error y, como $ ValidInput no se configuró, el ciclo while volverá y solicitará al usuario nuevamente.
Una vez que el usuario ha dado correctamente un número como entrada, queremos que el guión anuncie que está a punto de empezar realmente a hacer su trabajo y luego hacerlo.
Write-Host "` nGenerating $ UserInput nombres y números de teléfono. Tenga paciencia. N "1. . $ UserInput |ForEach-Object{ & lt; # INSERTAR NOMBRE ALEATORIO &NUMBER GENERATOR AQUÍ # & gt;}No se preocupe, no vamos a dejarlo solo para descubrir el nombre al azar &código generador de númerosEs solo un comentario de marcador para mostrarle dónde se ajustará la próxima sección( donde se realiza el trabajo real).
La línea Write-Host es bastante sencilla. Simplemente indica cuántos nombres y números de teléfono generará el script, y le pide al paciente que sea paciente mientras el script hace su trabajo. El `n al comienzo y al final de la cadena es para insertar una línea en blanco antes y después de esa salida, solo para darle una separación visual entre la línea de entrada y la lista de nombres &números. Tenga en cuenta que se trata de un "back-tick"( también conocido como "grave acento", generalmente la tecla arriba de la pestaña, a la izquierda de 1) y no un apóstrofo o comillas simples delante de cada n .
La siguiente parte muestra una forma diferente de usar un bucle ForEach-Object. Normalmente, cuando quiere que un bloque de script se ejecute una cierta cantidad de veces, configurará un bucle for para para( $ x = 1; $ x -le $ UserInput; $ x ++){ & lt; # INSERT SCRIPTAQUÍ # & gt;}. ForEach-Object nos permite simplificar esto al darle una lista de enteros y, en lugar de decirle que realmente haga algo con esos enteros, solo le damos un bloque de script estático para que se ejecute hasta que se quede sin enteros para hacerlo.
Parte 3: Generación de un nombre aleatorio
Generar el nombre es la parte más simple del resto de este proceso. Solo consta de tres pasos: elegir un apellido, elegir un género y elegir un nombre.¿Recuerdas ese alias que hicimos para Get-Random hace un tiempo? Es hora de empezar a usar eso.
$ Apellido = Get-Content "$ ScriptFolder \ Apellidos.txt" |g $ Hombre = g 2 if( $ Hombre){ $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" |g} else{ $ FirstName = Get-Content "$ ScriptFolder \ Females.txt" |g}La primera línea toma nuestra lista de apellidos, la introduce en el selector aleatorio y asigna el nombre elegido a $ Apellido.
La segunda línea selecciona el género de nuestra persona.¿Recuerda cómo Get-Random comienza a contar desde cero, y cómo cero es falso y todo lo demás es verdadero? Así es como estamos usando Get-Random 2 ( o el mucho más corto g 2 gracias a nuestro alias, ambos dan como resultado una elección entre cero o uno) para decidir si nuestra persona es hombre o no. La instrucción if / else elige aleatoriamente un nombre masculino o femenino en consecuencia.
Parte 4: Generando un número de teléfono aleatorio
Esta es la parte realmente divertida. Anteriormente, le mostramos cómo hay varias formas en que puede crear un número de teléfono inválido o ficticio. Como no queremos que todos nuestros números se parezcan demasiado entre sí, seleccionaremos aleatoriamente un formato de número no válido cada vez. Los formatos elegidos al azar se definirán por su Código de área y Código de intercambio, que colectivamente se almacenarán como $ Prefijo.
$ 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 "}}La primera línea es una generación directa de números aleatorios para elegir qué formatovamos a seguir por el número de teléfono. Entonces, la instrucción switch toma esa elección aleatoria y genera un prefijo $ en consecuencia.¿Recuerdas esa lista de tipos de números de teléfono no válidos? Los valores $ NumberFormat 0-3 corresponden a los primeros cuatro en esa lista. El valor 4 puede generar uno de los dos últimos, ya que ambos usan el código de intercambio "555".
Aquí, también puede ver que estamos utilizando otro truco con comillas dobles. Las comillas dobles no solo le permiten interpretar las variables antes de que se genere una cadena, sino que también le permiten procesar bloques de secuencias de comandos. Para hacerlo, ajuste el bloque de scripts así: "$( & lt; #SCRIPT HERE # & gt;)" .Entonces, lo que tienes arriba es una gran cantidad de dígitos aleatorios individualmente, algunos de ellos limitados en su rango o establecidos estáticamente de acuerdo con las reglas que debemos seguir. Cada cadena también tiene paréntesis y espaciado como normalmente esperaría ver en un código de área y un par de código de intercambio.
Lo último que tenemos que hacer antes de que estemos listos para dar salida a nuestro nombre &El número de teléfono es para generar una ID de Suscriptor, que se almacenará como $ Sufijo. Conmutador
( $ NumberFormat){ {$ _ -lt 4}{ $ Sufijo = "$( g 10) $( g 10) $( g 10) $( g 10)"} 4{ switch( $ Prefix){ '(800) 555 '{$ Suffix =' 0199 '} predeterminado{ $ Suffix = "01 $( g 10) $( g 10)"}}}}Debido a las reglas especiales para 555 números, no podemos simplementegenere cuatro dígitos aleatorios para el final de cada número de teléfono que nuestro script va a hacer. Entonces, el primer interruptor verifica si estamos tratando con un número 555.Si no, genera cuatro dígitos aleatorios. Si es un número 555, el segundo interruptor busca el código de área 800.Si eso coincide, solo hay un $ Suffix válido que podemos usar. De lo contrario, está permitido elegir entre 0100-0199.
Tenga en cuenta que hay algunas maneras diferentes en que se podría haber escrito este bloque, en lugar de cómo es. Ambas sentencias de cambio podrían haberse reemplazado por declaraciones if / else, ya que cada una de ellas solo maneja dos opciones. Además, en lugar de llamar específicamente "4" como una opción para la primera declaración de cambio, "predeterminado" podría haberse utilizado de manera similar a cómo se hizo en el segundo, ya que era la única opción que quedaba. La elección entre if / else vs. switch, o dónde usar la palabra clave predeterminada en lugar de valores específicos, a menudo se reduce a una cuestión de preferencia personal. Mientras funcione, usa lo que sea más cómodo con él.
Ahora es el momento de la salida.
Write-Output "$ FirstName $ Apellido $ Prefix- $ Suffix"}Este es casi tan simple como se consigue en el script. Simplemente muestra el nombre y apellido separados por espacios, luego otro espacio antes del número de teléfono. Aquí es donde también se agrega el guión estándar entre el código de Exchange y el ID del suscriptor.
Ese corchete de cierre en la parte inferior es el final del bucle ForEach-Object anterior; omita esto si ya lo tienes.
Parte 5: Limpieza y ejecución de la secuencia de comandos
Después de todo el trabajo está hecho, un buen script sabe cómo limpiarlo. Una vez más, la eliminación de variables a continuación no es realmente necesaria si solo va a ejecutar el script desde la consola, pero lo querrá si alguna vez planea ejecutarlo en el ISE.
Remove-Item alias: \ g Remove-Variable ScriptFolder, RequiredFiles, Surname, Male, FirstName, NumberFormat, Prefix, Suffix, ValidInput, UserInputDespués de que hayas terminado, guarda el script con una extensión ".ps1"en la misma carpeta que tus archivos de nombres. Asegúrate de que tu ExecutionPolicy esté configurada para que la secuencia de comandos pueda ejecutarse y dale un giro.
Aquí hay una captura de pantalla del script en acción:
También puede descargar un archivo ZIP que contiene este script de PowerShell y archivos de texto con listas de nombres, desde el siguiente enlace. Nombre aleatorio
&Generador de número de teléfono para PowerShell