Cómo generar nombres y números de teléfono aleatorios con PowerShell
Cuando necesita un conjunto de datos para realizar pruebas o demostraciones, y ese conjunto debe representar información de identificación personal (PII), generalmente no desea utilizar datos reales que representen personas reales. Aquí, lo guiaremos a través de cómo puede usar PowerShell para generar una lista de nombres y números de teléfono aleatorios para tal ocasión..
Que necesitas
Antes de comenzar, hay algunas herramientas e información que debe tener:
Potencia Shell
Esta secuencia de comandos se desarrolló con PowerShell 4.0 y también se ha probado su compatibilidad con PowerShell 2.0. PowerShell 2.0 o posterior se ha incorporado a Windows desde Windows 7. También está disponible para Windows XP y Vista como parte de 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 actualizarse a él como parte de una actualización de WMF desde el Centro de descarga de Microsoft. No está disponible para XP o Vista.
Los nombres
Necesitará algunas listas de nombres para alimentar al generador aleatorio. Una gran fuente para una mucho de nombres e información sobre su popularidad (aunque no se utilizará para este guión), es la Oficina del Censo de los Estados Unidos. Las listas disponibles en los enlaces a continuación son muy grandes, por lo que puede 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ó alrededor de 1,5 segundos para generar utilizando las listas completas, pero su millaje variará dependiendo de las especificaciones de su propio sistema..
- Los apellidos
- Nombres masculinos
- Nombres femeninos
Independientemente de la fuente que utilice, deberá generar tres archivos de texto que el script puede usar como agrupaciones para su selección de 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 de los que desea que se seleccione el script. Ejemplo:
Smith Johnson Williams Jones Brown
Machos.txt debe contener los nombres masculinos de los que desea que se seleccione el script. Ejemplo:
James John Robert Michael William
Hembras.txt debe contener los nombres femeninos de los que desea que se seleccione el script. Ejemplo:
Mary Patricia Linda Barbara Elizabeth
Reglas para números de teléfono
Si desea asegurarse de que sus números de teléfono no coincidan con el número de teléfono real de nadie, la forma más sencilla es utilizar el conocido Código de intercambio "555". Pero si va a mostrar un conjunto de datos con muchos números de teléfono, el 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 violen las reglas del Plan de numeración de América del Norte (NANP). A continuación, se incluyen algunos ejemplos de números de teléfono no válidos, que representan cada clase de número que generará este script:
- (157) 836-8167
Este número no es válido porque los códigos de área no pueden comenzar con un 1 o un 0. - (298) 731-6185
Este número no es válido porque el NANP no está asignando códigos de área con 9 como el segundo dígito. - (678) 035-7598
Este número no es válido porque los códigos de Exchange no pueden comenzar con un 1 o un 0. - (752) 811-1375
Este número no es válido porque los códigos de Exchange no pueden terminar con dos 1s. - (265) 555-0128
Este número no es válido porque el código de intercambio 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 realizar su propia investigación para verificar las reglas actuales que se aplican a la configuración regional para la cual generará números de teléfono..
Comandos comunes
Hay algunos comandos bastante comunes que se van a usar a lo largo de este script, por lo que debe tener una idea básica de lo que significan estos antes de que nos sumergamos en la escritura real..
- 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.
- si ... otra cosa Las declaraciones 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.
- cambiar Las declaraciones son como si las declaraciones con más opciones. Switch verificará un objeto en varias condiciones y ejecutará los bloques de script especificados para las condiciones que coinciden con el objeto. También puede, opcionalmente, especificar un bloque predeterminado que solo se ejecutará si no se cumplen otras condiciones. Los estados de cambio también usan la variable $ _ para referirse al elemento actual que se está procesando.
- mientras Las declaraciones le permiten repetir continuamente un bloque de script siempre que se cumpla una determinada condición. Una vez que sucede algo que hace que la condición ya no sea verdadera cuando finaliza el bloque de script, el bucle sale.
- trata de atraparlo Las declaraciones ayudan con el manejo de errores. Si algo sale mal con el bloque de script especificado para try, se ejecutará el bloque catch.
- Obtener el contenido Hace lo que dice en la lata. Obtiene el contenido de un objeto especificado, generalmente un archivo. Esto se puede usar para mostrar el contenido de un archivo de texto en la consola o, como en esta secuencia de comandos, pasar el contenido a lo largo de la tubería para ser usado con otros comandos.
- Write-Host pone cosas en la consola. Esto se utiliza para presentar mensajes al usuario y no se incluye en la salida del script si la salida se redirige.
- Escritura-salida en realidad genera salida. Normalmente, esto se descarga en la consola, pero también puede ser redirigido por otros comandos.
Hay otros comandos en el script, pero los explicaremos a medida que avanzamos.
Construyendo el Script
Ahora es el momento de ensuciarnos las manos..
Parte 1: Preparándose para ir
Si desea que su secuencia de comandos comience a ejecutarse desde una consola limpia, aquí tiene la primera línea que desea.
Clear-Host
Ahora que tenemos una pantalla limpia, lo siguiente que queremos hacer es revisar el script para asegurarnos de que todo lo que necesita está en su lugar. Para hacerlo, debemos comenzar diciéndole dónde buscar y qué buscar.
$ ScriptFolder = Split-Path $ MyInvocation.MyCommand.Definition -Parent $ RequiredFiles = ('' Males.txt ',' Females.txt ',' Apellidos.txt ')
La primera línea allí 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 el mismo (o una ruta relativa conocida de ese directorio), porque de lo contrario encontrará errores cuando intente ejecutar el script mientras se encuentra en otro. directorio de trabajo.
La segunda línea crea una matriz de nombres de archivos que son necesarios para que el script se ejecute correctamente. Usaremos esto, junto con la variable $ ScriptFolder, en la siguiente parte en la que verificamos que esos archivos estén presentes.
$ RequiredFiles | ForEach-Object if (! (Test-Path "$ ScriptFolder \ $ _")) Write-Host "$ _ no encontrado". -PrimeroFondoColor Rojo $ MissingFiles ++
Esta parte de la secuencia de comandos envía la matriz $ RequiredFiles a un bloque ForEach-Object. Dentro de ese bloque de secuencias de comandos, la instrucción if utiliza la ruta de prueba para ver si el archivo que estamos buscando está donde 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 exclamación en que hay una no operador, que invierte la respuesta de Test-Path antes de pasarlo a la sentencia if. Entonces, si Test-Path devuelve falso (es decir, el archivo que buscamos 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 usará a menudo en este script, es el uso de comillas dobles en lugar de comillas simples. Cuando pones algo entre comillas simples, PowerShell lo trata como una cadena estática. Lo que sea que esté en las comillas simples se pasará 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 correr Ruta de prueba '$ ScriptFolder \ $ _' En realidad estaremos haciendo algo más como Ruta de prueba 'C: \ Scripts \ Apellidos.txt' (Suponiendo que su script esté en C: \ Scripts, y ForEach-Object está trabajando actualmente en 'Apellidos.txt').
Por cada archivo no encontrado, Write-Host publicará un mensaje de error en rojo para indicarle qué archivo falta. Luego incrementa la variable $ MissingFiles que se usará en la siguiente pieza, para error y para salir si faltaban archivos..
if ($ MissingFiles) Write-Host "No se pudieron encontrar los archivos de origen de $ MissingFiles. Script de cancelación". -ForegroundColor Red Remove-Variable ScriptFolder, RequiredFiles, MissingFiles Exit
Aquí hay otro buen truco que puedes hacer con las declaraciones. La mayoría de las guías verá si las declaraciones le indicarán que use un operador para verificar una condición que coincida. Por ejemplo, aquí podríamos usar si ($ 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 donde usamos Test-Path), no es necesario. También puede prescindir de él en casos como este, cuando solo está haciendo pruebas para ver si un número no es cero. Cualquier número que no sea cero (positivo o negativo) se trata como verdadero, mientras que cero (o, como puede ocurrir aquí, una variable no existente) se tratará como falso.
Si $ MissingFiles existe y es distinto de cero, Write-Host publicará un mensaje que le indicará cuántos archivos faltaron y que el script abortará. Luego, Remove-Variable limpiará todas las variables que hemos creado y Exit cerrará el script. En la consola normal de PowerShell, Remove-Variable no es realmente necesaria para este propósito en particular porque las variables establecidas por los scripts normalmente se descartan cuando el script sale. Sin embargo, el ISE de PowerShell se comporta de forma un poco diferente, por lo que es posible que desee mantenerlo en funcionamiento si planea ejecutar el script desde allí..
Si todas las cosas están en orden, el guión continuará. Una preparación más para hacer es un alias que estaremos encantados de tener más adelante..
New-Alias g Get-Random
Los alias se utilizan 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 -> Get-ChildItem y cat -> Get-Content) o para hacer referencias cortas para comandos de uso común. Aquí, estamos haciendo una muy referencia corta para la Get-Random comando que se va a utilizar mucho más adelante.
Get-Random prácticamente 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 utilizar para generar números aleatorios. Lo que hay que recordar acerca de Get-Random y los números es que, como muchas otras operaciones de computadora, comienza a contar desde cero. Así que en lugar de Get-Random 10 lo que significa que el "dame un número del 1 al 10" es más natural, realmente significa "dame un número del 0 al 9." Puedes ser más específico acerca de la selección del número, por lo que Get-Random se comporta más como si estuvieras naturalmente. esperen, pero no necesitaremos eso en este script.
Parte 2: Obtener información del usuario y empezar a trabajar
Si bien un script que genera solo un nombre y número de teléfono al azar es excelente, es mucho mejor si el script le permite al usuario especificar cuántos nombres y números desea obtener en un solo lote. Desafortunadamente, no podemos confiar en que los usuarios siempre den una entrada válida. Entonces, hay un poquito más para esto que solo $ UserInput = Read-Host.
while (! $ ValidInput) try [int] $ UserInput = Read-Host -Prompt 'Elementos que se generarán' $ ValidInput = $ true catch Write-Host 'Entrada no válida. Introduce solo un número. -PrimeroColor Rojo
La instrucción while anterior comprueba, y niega, el valor de $ ValidInput. Mientras $ ValidInput sea falso, o no exista, se mantendrá en bucle a través de su bloque de script.
La instrucción try toma la entrada del usuario, a través de Read-Host, e intenta convertirla en un valor entero. (Eso es [En t] antes de Read-Host.) Si tiene éxito, establecerá $ ValidInput en verdadero para que el bucle while pueda salir. Si no tiene éxito, el bloque catch publica un error y, debido a que $ ValidInput no se estableció, el ciclo while regresará y volverá a avisar al usuario.
Una vez que el usuario ha asignado correctamente un número como entrada, queremos que la secuencia de comandos anuncie que está a punto de comenzar realmente a hacer su trabajo y luego de hacerlo..
Write-Host "'nGenerando $ UserInput Nombres y números de teléfono. Por favor sea paciente.' N" 1… $ UserInput | ForEach-Object
No se preocupe, no lo dejaremos solo para descubrir el código aleatorio del generador de números y nombres. Eso es solo un comentario de marcador de posición para mostrarle dónde encajará la siguiente sección (donde se realizará 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 usuario que tenga paciencia mientras el script hace su trabajo. los'norte al principio y al final de la cadena es insertar una línea en blanco antes y después de esa salida, solo para darle una cierta separación visual entre la línea de entrada y la lista de nombres y números. Tenga en cuenta que se trata de una marca de retroceso (también conocido como "acento grave", generalmente la tecla que se encuentra arriba, a la izquierda de 1) y no un apóstrofe o una comilla simple delante de cada uno norte.
La siguiente parte muestra una forma diferente de usar un bucle ForEach-Object. Normalmente, cuando desea que un bloque de script se ejecute un cierto número de veces, configurará un bucle regular para para ($ x = 1; $ x -le $ UserInput; $ x ++) . ForEach-Object nos permite simplificarlo al proporcionarle una lista de enteros y, en lugar de decirle que haga algo con esos enteros, solo le damos un bloque de script estático hasta que se quede sin enteros para hacerlo..
Parte 3: Generando un nombre aleatorio
Generar el nombre es el bit 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 poner eso en uso..
$ Apellido = Obtener contenido "$ ScriptFolder \ Apellidos.txt" | g $ Male = g 2 if ($ Male) $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" | g else $ FirstName = Get-Content "$ ScriptFolder \ Females.txt" | sol
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 elige 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 tienen la opción de elegir entre cero o uno para decidir si nuestra persona es masculina o no. La declaración if / else luego elige al azar un nombre masculino o femenino.
Parte 4: Generar un número de teléfono al azar
Aquí está la parte realmente divertida. Anteriormente, le mostramos cómo hay varias formas de hacer un número de teléfono inválido o ficticio. Ya que no queremos que todos nuestros números se vean muy similares entre sí, elegiremos un formato de número no válido cada vez. Los formatos elegidos al azar serán definidos por su Código de área y Código de intercambio, que se almacenarán colectivamente como $ Prefijo.
$ NumberFormat = g 5 switch ($ NumberFormat) 0 $ Prefix = "($ (g 2) $ (g 10) $ (g 10)) $ (g 10) $ (g 10) $ (g 10)" 1 $ Prefijo = "($ (g 10) 9 $ (g 10)) $ (g 10) $ (g 10) $ (g 10)" 2 $ Prefijo = "($ (g 10) $ (g 10) $ (g 10)) $ (g 2) $ (g 10) $ (g 10) " 3 $ Prefijo =" ($ (g 10) $ (g 10) $ (g 10)) $ (g 10) 11 " 4 $ Prefijo =" ($ (g 10) $ (g 10) $ (g 10)) 555 "
La primera línea es una generación de números aleatorios directa para elegir qué formato vamos a seguir para el número de teléfono. Luego, la instrucción de cambio toma esa elección aleatoria y genera un $ Prefijo en consecuencia. ¿Recuerda esa lista de tipos de números de teléfono inválidos? Los valores de $ 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 puedes ver que estamos usando otro truco con comillas dobles. Las comillas dobles no solo le permiten interpretar variables antes de que se genere una cadena, sino que también le permiten procesar bloques de secuencias de comandos. Para hacer eso, envuelve el bloque de script de esta manera: PS. Entonces, lo que tiene arriba es una gran cantidad de dígitos aleatorizados individualmente, con algunos de ellos limitados en su rango o establecidos de manera estática de acuerdo con las reglas que debemos seguir. Cada cadena también tiene paréntesis y espaciado como normalmente esperaría ver en un par de Código de Área y Código de Intercambio.
Lo último que debemos hacer antes de que estemos listos para emitir nuestro nombre y número de teléfono es generar una ID de suscriptor, que se almacenará como $ Sufijo.
switch ($ NumberFormat) $ _ -lt 4 $ Suffix = "$ (g 10) $ (g 10) $ (g 10) $ (g 10)" 4 switch ($ Prefix) '( 800) 555 '$ Sufijo =' 0199 ' predeterminado $ Sufijo = "01 $ (g 10) $ (g 10)"
Debido a las reglas especiales para los 555 números, no podemos simplemente generar cuatro dígitos aleatorios para el final de cada número de teléfono que nuestro script creará. 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 verifica el código de área 800. Si eso coincide, solo hay un sufijo válido de $ que podemos usar. De lo contrario, está permitido elegir entre 0100-0199.
Tenga en cuenta que hay algunas formas diferentes en que este bloque podría haberse escrito, en lugar de la forma en que está. Ambas sentencias de conmutación podrían haber sido reemplazadas por sentencias if / else, ya que cada una solo maneja dos opciones. Además, en lugar de llamar específicamente "4" como una opción para la primera instrucción de cambio, "predeterminado" podría haberse utilizado de manera similar a como se hizo en la segunda, 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 te resulte más cómodo..
Ahora, es hora de salida.
Escritura-salida "$ Nombre de pila $ Apellido $ Prefijo- $ Sufijo"
Este es casi tan simple como aparece en el guión. Simplemente envía el nombre y el 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 la identificación del suscriptor.
Ese corchete de cierre en la parte inferior es el final del bucle ForEach-Object de antes - omita esto si ya lo tiene.
Parte 5: Limpiar y ejecutar el script
Después de que todo el trabajo está hecho, un buen script sabe cómo limpiar después de sí mismo. Nuevamente, 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.
Alias de elemento eliminado: \ g Eliminar variable ScriptFolder, RequiredFiles, Apellido, Hombre, Nombre, NumberFormat, Prefijo, Sufijo, ValidInput, UserInput
Una vez que haya terminado, guarde la secuencia de comandos con la extensión ".ps1" en la misma carpeta que los 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 y generador de números de teléfono para PowerShell