10Sep
Quando è necessario un set di dati per il test o la dimostrazione e tale insieme deve rappresentare le informazioni identificative personali( PII), generalmente non si desidera utilizzare dati reali che rappresentano persone reali. Qui, ti illustreremo come utilizzare PowerShell per generare un elenco di nomi casuali e numeri di telefono proprio per un'occasione del genere.
Cosa ti serve
Prima di iniziare, sono disponibili alcuni strumenti e informazioni:
PowerShell
Questo script è stato sviluppato utilizzando PowerShell 4.0 ed è stato testato per la compatibilità con PowerShell 2.0.PowerShell 2.0 o versione successiva è stato integrato in Windows da Windows 7. È inoltre disponibile per Windows XP e Vista come parte di Windows Management Framework( WMF).Di seguito sono riportati ulteriori dettagli e collegamenti per i download.
- PowerShell 2.0 viene fornito con Windows 7. Gli utenti di Windows XP SP3 e Vista( SP1 o versioni successive) possono scaricare la versione WMF appropriata da Microsoft in KB968929.Non è supportato su XP SP2 o versioni precedenti o Vista senza SP1.
- PowerShell 4.0 viene fornito con Windows 8.1.Gli utenti di Windows 7 SP1 possono eseguire l'aggiornamento come parte di un aggiornamento WMF dall'Area download Microsoft. Non è disponibile per XP o Vista. Nomi
Avrai bisogno di alcuni elenchi di nomi da inserire nel generatore casuale. Un'ottima fonte per un lotto di nomi, e informazioni sulla loro popolarità( anche se non sarà usato per questo script), è l'United States Census Bureau. Gli elenchi disponibili ai link qui sotto sono molto grandi, quindi potresti volerli ridurre un po 'se stai pianificando di generare molti nomi e numeri contemporaneamente. Sul nostro sistema di test, ogni coppia nome / numero impiega circa 1,5 secondi per generare utilizzando gli elenchi completi, ma il tuo chilometraggio varierà a seconda delle specifiche del tuo sistema.
- Cognomi
- Nomi maschili
- Nomi femminili
Indipendentemente dalla sorgente utilizzata, è necessario generare tre file di testo che lo script può utilizzare come pool per la selezione del nome. Ogni file dovrebbe contenere solo nomi e un solo nome per riga. Questi devono essere memorizzati nella stessa cartella dello script PowerShell.
Cognomi.txt dovrebbe contenere i cognomi da cui lo script deve essere selezionato. Esempio:
Smith Johnson Williams Jones BrownMales.txt dovrebbe contenere i nomi maschili di cui si desidera selezionare lo script. Esempio:
James John Robert Michael WilliamFemales.txt dovrebbe contenere i nomi femminili da cui si desidera selezionare lo script. Esempio:
Mary Patricia Linda Barbara ElizabethRegole per i numeri di telefono
Se vuoi essere sicuro che i tuoi numeri di telefono non coincidano con il numero di telefono reale di nessuno, il modo più semplice è utilizzare il noto codice di scambio "555".Ma se hai intenzione di mostrare un set di dati con molti numeri di telefono, quel 555 inizierà a sembrare piuttosto monotono, molto veloce. Per rendere le cose più interessanti, genereremo altri numeri di telefono che violano le regole NANP( North American Numbering Plan).Di seguito sono riportati alcuni esempi di numeri telefonici non validi, che rappresentano ogni classe di numero che verrà generata da questo script:
- ( 157) 836-8167
Questo numero non è valido perché i prefissi non possono iniziare con 1 o 0. - ( 298) 731-6185
Questo numero non è valido perché NANP non sta assegnando codici area con 9 come seconda cifra. - ( 678) 035-7598
Questo numero non è valido perché i codici di scambio non possono iniziare con 1 o 0. - ( 752) 811-1375
Questo numero non è valido perché i codici di scambio non possono terminare con due 1s. - ( 265) 555-0128
Questo numero non è valido perché il codice di Exchange è 555, e l'ID sottoscrittore si trova all'interno dell'intervallo riservato ai numeri fittizi. - ( 800) 555-0199
Questo numero è l'unico numero 800 con un codice di scambio 555 che è riservato per l'uso come numero fittizio.
Si noti che le regole di cui sopra sono soggette a modifiche e possono variare in base alla giurisdizione. Dovresti fare le tue ricerche per verificare le regole attuali applicabili alle impostazioni locali per le quali genererai i numeri di telefono. Comandi comuni
Ci sono alcuni comandi abbastanza comuni che verranno usati in questo script, quindi dovresti avere un'idea di base di cosa significhi prima di immergerci effettivamente nella scrittura.
- Oggetto ForEach acquisisce un array o un elenco di oggetti ed esegue l'operazione specificata su ciascuno di essi. All'interno di un blocco di script ForEach-Object, la variabile $ _ viene utilizzata per fare riferimento all'elemento corrente in fase di elaborazione.
- if. .. else Le istruzioni consentono di eseguire un'operazione solo se vengono soddisfatte determinate condizioni e( facoltativamente) specificare cosa deve essere fatto quando tale condizione non viene soddisfatta. Le dichiarazioni di
- sono come se le affermazioni con più scelte. Switch controllerà un oggetto in base a diverse condizioni ed eseguirà tutti i blocchi di script specificati per le condizioni a cui l'oggetto corrisponde.È anche possibile, facoltativamente, specificare un blocco predefinito che verrà eseguito solo se non sono soddisfatte altre condizioni. Le istruzioni switch utilizzano anche la variabile $ _ per fare riferimento all'elemento corrente in fase di elaborazione.
- mentre le istruzioni consentono di ripetere continuamente un blocco di script fino a quando viene soddisfatta una determinata condizione. Quando succede qualcosa che fa sì che la condizione non sia più vera quando il blocco di script è terminato, il ciclo termina.
- prova. .. cattura le istruzioni per la gestione degli errori. Se qualcosa va storto con il blocco di script specificato per try, il blocco catch verrà eseguito.
- Get-Content fa ciò che dice sulla latta. Ottiene il contenuto di un oggetto specificato, di solito un file. Questo può essere usato per visualizzare il contenuto di un file di testo sulla console o, come in questo script, passare il contenuto lungo la pipeline per essere utilizzato con altri comandi.
- Write-Host mette cose nella console. Questo è usato per presentare messaggi all'utente e non è incluso nell'output dello script se l'output viene reindirizzato.
- Write-Output in realtà genera effettivamente l'output. Normalmente, questo viene scaricato sulla console ma può anche essere reindirizzato da altri comandi.
Ci sono altri comandi nello script, ma li spiegheremo mentre procediamo.
Creazione dello script
Ora è il momento di sporcarsi le mani.
Parte 1: Prepararsi per andare
Se ti piace che lo script inizi a girare da una console pulita, ecco la prima riga che vuoi inserire.
Clear-HostOra che abbiamo uno schermo pulito, la prossima cosa che vogliamo fare è avere il controllo dello script per assicurarci che tutto ciò di cui ha bisogno sia a posto. Per farlo, dobbiamo iniziare dicendogli dove cercare e cosa cercare.
$ ScriptFolder = Percorso diviso $ MyInvocation. MyCommand. Definition -Parent $ RequiredFiles =( 'Males.txt', 'Females.txt', 'Cognomi.txt')La prima riga è molto utile per qualsiasi script. Definisce una variabile che punta alla cartella contenente lo script. Questo è essenziale se il tuo script ha bisogno di altri file che si trovano nella stessa directory di se stesso( o un percorso relativo noto da quella directory), perché altrimenti incontrerai errori se e quando proverai a eseguire lo script mentre sei in un altrodirectory di lavoro.
La seconda riga crea una serie di nomi di file necessari per il corretto funzionamento dello script. Lo useremo, insieme alla variabile $ ScriptFolder, nel prossimo pezzo in cui controlliamo per accertarci che quei file siano presenti.
$ RequiredFiles |ForEach-Object{ if( !( Test-Path "$ ScriptFolder \ $ _")){ Scrivi-Host "$ _ non trovato."-ForegroundColor Red $ MissingFiles ++}}Questo blocco di script invia l'array $ RequiredFiles in un blocco ForEach-Object. All'interno di quel blocco di script, l'istruzione if usa Test-Path per vedere se il file che stiamo cercando è quello a cui appartiene. Test-Path è un semplice comando che, quando viene fornito un percorso file, restituisce una risposta di base vera o falsa per dirci se il percorso punta a qualcosa che esiste. Il punto esclamativo in esso è un operatore non , che inverte la risposta di Test-Path prima di passarlo all'istruzione if. Quindi se Test-Path restituisce false( ovvero, il file che stiamo cercando non esiste), verrà convertito in true in modo che l'istruzione if esegua il suo blocco di script.
Un'altra cosa da notare qui, che sarà usata spesso in questo script, è l'uso di virgolette invece di virgolette singole. Quando si inserisce qualcosa tra virgolette singole, PowerShell lo considera come una stringa statica. Tutto ciò che è racchiuso tra virgolette singole passerà esattamente esattamente così com'è.Le doppie virgolette dicono a PowerShell di tradurre le variabili e alcuni altri oggetti speciali all'interno della stringa prima di passarla. Qui, le doppie virgolette significano che invece di eseguire Test-Path '$ ScriptFolder \ $ _' faremo in realtà qualcosa di più come Test-Path 'C: \ Scripts \ Cognomi.txt' ( assumendo il tuolo script è in C: \ Scripts e ForEach-Object sta attualmente lavorando su 'Cognomi.txt').
Per ogni file non trovato, Write-Host pubblicherà un messaggio di errore in rosso per dirti quale file manca. Quindi incrementa la variabile $ MissingFiles che verrà utilizzata nel prossimo pezzo, in errore e uscirà se mancano dei file.
if( $ MissingFiles){ Write-Host "Impossibile trovare i file di origine $ MissingFiles. Script di interruzione."-ForegroundColor Red Remove-Variable ScriptFolder, RequiredFiles, MissingFiles Esci}Ecco un altro trucco che puoi fare con le istruzioni if. La maggior parte delle guide vedrai se le istruzioni ti diranno di usare un operatore per verificare la presenza di una condizione corrispondente. Ad esempio, qui potremmo usare se( $ MissingFiles -gt 0) per vedere se $ MissingFiles è maggiore di zero. Tuttavia, se stai già utilizzando comandi che restituiscono un valore booleano( come nel blocco precedente in cui stavamo usando Test-Path) non è necessario. Puoi anche farne a meno in casi come questo, quando stai solo testando per vedere se un numero è diverso da zero. Qualsiasi numero diverso da zero( positivo o negativo) viene trattato come vero, mentre zero( o, come può accadere qui, una variabile inesistente) verrà trattato come falso.
Se $ MissingFiles esiste ed è diverso da zero, Write-Host pubblicherà un messaggio che indica quanti file mancano e che lo script abortirà.Quindi, Remove-Variable pulirà tutte le variabili che abbiamo creato e Exit chiuderà lo script. Alla normale console di PowerShell, Remove-Variable non è realmente necessario per questo particolare scopo perché le variabili impostate dagli script vengono normalmente scartate al termine dello script. Tuttavia, l'ISE di PowerShell si comporta in modo leggermente diverso, quindi potresti voler tenerlo presente se prevedi di eseguire lo script da lì.
Se tutto è in ordine, lo script continuerà.Un'altra preparazione da fare è un alias che saremo davvero lieti di avere in seguito.
New-Alias g Get-RandomGli alias vengono utilizzati per creare nomi alternativi per i comandi. Questi possono essere utili per aiutarci a familiarizzare con la nuova interfaccia( ad esempio: PowerShell ha alias incorporati come dir - & gt; Get-ChildItem e cat - & gt; Get-Content ) o per creare riferimenti a mano cortaper comandi di uso comune. Qui, stiamo creando un molto di riferimento abbreviato per il comando Get-Random che verrà utilizzato molto più tardi.
Get-Random fa praticamente quello che suggerisce il nome. Dato un input( come un elenco di nomi) come input, seleziona un elemento casuale dall'array e lo sputa. Può anche essere usato per generare numeri casuali. La cosa da ricordare su Get-Random e sui numeri è che, come molte altre operazioni del computer, inizia a contare da zero. Quindi invece di Get-Random 10 che significa il più naturale "dammi un numero da 1 a 10" significa davvero "dammi un numero da 0 a 9." Puoi essere più specifico sulla selezione del numero, in modo che Get-Random si comporta più come ci si aspetterebbe naturalmente, ma non ci servirà in questo script.
Parte 2: Ottenere l'input dell'utente e mettersi all'opera
Mentre uno script che genera solo un nome casuale &il numero di telefono è ottimo, è molto meglio se lo script consente all'utente di specificare quanti nomi &numeri che vogliono ottenere in un lotto. Sfortunatamente, non possiamo davvero fidarci degli utenti per dare sempre input validi. Quindi, c'è un po 'di più su questo appena $ UserInput = Read-Host .
while( ! $ ValidInput){ try{ [int] $ UserInput = Read-Host -Prompt 'Elementi da generare' $ ValidInput = $ true} catch{ Write-Host 'Input non valido. Inserisci solo un numero. '-ForegroundColor Red}}L'istruzione while in alto controlla e annulla il valore di $ ValidInput. Finché $ ValidInput è falso, o non esiste, continuerà a scorrere attraverso il suo blocco di script.
L'istruzione try accetta l'input dell'utente, tramite Read-Host, e tenta di convertirlo in un valore intero.(Questo è [int] prima di Read-Host.) Se ha successo, imposterà $ ValidInput su true in modo che il ciclo while possa uscire. Se non riesce, il blocco catch registra un errore e, poiché $ ValidInput non è stato impostato, il ciclo while tornerà indietro e richiederà di nuovo all'utente.
Una volta che l'utente ha dato correttamente un numero come input, vogliamo che lo script annunci che sta per iniziare effettivamente a fare il suo lavoro e poi a farlo.
Write-Host "` nGenerando $ UserInput nomi e numeri di telefono. Si prega di essere paziente. N "1. . $ UserInput |ForEach-Object{ & lt; # INSERT RANDOM NAME &NUMERO GENERATORE QUI # & gt;}Non preoccuparti, non ti lasceremo da solo per capire il nome casuale &codice generatore di numeri. Questo è solo un commento di segnaposto per mostrarti dove andrà la prossima sezione( dove viene svolto il vero lavoro).
La linea Write-Host è piuttosto semplice. Dice semplicemente quanti nomi e numeri di telefono generano lo script e chiede all'utente di essere paziente mentre lo script fa il suo lavoro. L' `n all'inizio e alla fine della stringa è quello di inserire una riga vuota prima e dopo quell'output, solo per dargli una certa separazione visiva tra la linea di input e l'elenco dei nomi &numeri. Si noti che si tratta di un segno di spunta( AKA "grave accento" - in genere il tasto sopra la scheda, a sinistra di 1) e non un apostrofo o una virgoletta singola davanti a ogni n .
La parte successiva mostra un modo diverso per utilizzare un ciclo ForEach-Object. In genere, quando si desidera che un blocco di script venga eseguito un certo numero di volte, si imposta un ciclo regolare per per( $ x = 1; $ x -le $ UserInput; $ x ++){ & lt; # INSERT SCRIPTQUI # & gt;}. ForEach-Object ci consente di semplificare questo alimentando una lista di numeri interi e, invece di dirgli di fare effettivamente qualsiasi cosa con quei numeri interi, gli basta dare un blocco di script statico da eseguire fino a quando non esaurisce gli interi per farlo.
Parte 3: Generazione di un nome casuale
La generazione del nome è il bit più semplice del resto di questo processo. Consiste solo di tre passaggi: scegliere un cognome, selezionare un genere e scegliere un nome. Ricordi quell'alias fatto per Get-Random da un po '?È ora di iniziare a mettere quello da usare.
$ Cognome = Get-Content "$ ScriptFolder \ Cognomi. Txt" |g $ Male = g 2 if( $ Male){ $ FirstName = Get-Content "$ ScriptFolder \ Males.txt" |g} else{ $ FirstName = Get-Content "$ ScriptFolder \ Females.txt" |g}La prima riga prende la nostra lista di cognomi, la alimenta nel selezionatore casuale e assegna il nome scelto a $ Cognome.
La seconda riga sceglie il sesso della nostra persona. Ricorda come Get-Random inizia a contare da zero, e quanto zero è falso e tutto il resto è vero?È così che utilizziamo Get-Random 2 ( o molto più breve g 2 grazie al nostro pseudonimo - entrambi determinano una scelta tra zero o uno) per decidere se la nostra persona è maschio o no. Successivamente, l'istruzione if / else sceglie casualmente un nome maschile o femminile di conseguenza.
Parte 4: Generazione di un numero di telefono casuale
Ecco la parte davvero divertente. In precedenza, ti abbiamo mostrato come ci sono diversi modi in cui puoi creare un numero di telefono non valido o fittizio. Dal momento che non vogliamo che tutti i nostri numeri sembrino troppo simili tra loro, selezioneremo casualmente un formato numerico non valido ogni volta. I formati scelti casualmente saranno definiti dal loro Prefisso e Codice di scambio, che verranno collettivamente memorizzati come $ 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 "}}La prima riga è una semplice generazione di numeri casuali per scegliere quale formatoseguiremo per il numero di telefono. Quindi, l'istruzione switch prende quella scelta casuale e genera un prefisso $ di conseguenza. Ricorda quell'elenco di tipi di numeri di telefono non validi? I valori $ NumberFormat 0-3 corrispondono ai primi quattro di quell'elenco. Il valore 4 può generare uno degli ultimi due, poiché entrambi utilizzano il codice di scambio "555".
Qui, puoi anche vedere che stiamo usando un altro trucco con virgolette. Le virgolette non ti permettono solo di interpretare le variabili prima che una stringa venga emessa, ma ti permettono anche di elaborare blocchi di script. Per fare ciò, si avvolge il blocco di script in questo modo: "$( & lt; #SCRIPT HERE # & gt;)" .Quindi quello che hai sopra è un sacco di cifre individualmente randomizzate, alcune delle quali sono limitate nel loro intervallo o impostate staticamente in base alle regole che dobbiamo seguire. Ogni stringa ha anche parentesi e spaziatura come normalmente ci si aspetterebbe di vedere in una coppia di codici area e codice di scambio.
L'ultima cosa che dobbiamo fare prima di essere pronti a produrre il nostro nome &numero di telefono è quello di generare un ID sottoscrittore, che verrà memorizzato come $ Suffisso. Switch
( $ NumberFormat){ {$ _ -lt 4}{ $ Suffisso = "$( g 10) $( g 10) $( g 10) $( g 10)"} 4{ switch( $ Prefix){ '(800) 555 '{$ Suffisso =' 0199 '} default{ $ Suffisso = "01 $( g 10) $( g 10)"}}}}A causa delle regole speciali per i numeri 555, non possiamo sologenera quattro cifre casuali per la fine di ogni numero di telefono che il nostro script sta per fare. Quindi, il primo interruttore controlla se abbiamo a che fare con un numero 555.In caso contrario, genera quattro cifre casuali. Se si tratta di un numero 555, il secondo interruttore verifica il codice area 800.Se ciò corrisponde, è possibile utilizzare solo un suffisso $ valido. Altrimenti, è permesso scegliere tra il 0100-0199.
Si noti che ci sono diversi modi in cui questo blocco potrebbe essere stato scritto, anziché come è.Entrambe le istruzioni switch potrebbero essere state sostituite con istruzioni if / else, poiché ciascuna di esse gestisce solo due scelte. Inoltre, invece di chiamare esplicitamente "4" come opzione per la prima istruzione switch, "default" avrebbe potuto essere utilizzato in modo simile a come è stato fatto nel secondo poiché era l'unica opzione rimasta. La scelta tra if / else vs. switch, o dove usare la parola chiave predefinita invece di valori specifici, spesso si riduce a una questione di preferenze personali. Finché funziona, usa quello che ti è più comodo.
Ora, è l'ora dell'output.
Write-Output "$ FirstName $ Cognome $ Prefix- $ Suffix"}Questo è praticamente tanto semplice quanto lo script. Emette solo il nome e il cognome separati da spazi, quindi un altro spazio prima del numero di telefono. Qui viene aggiunto anche il trattino standard tra codice di scambio e ID sottoscrittore.
Quella parentesi di chiusura in basso è la fine del ciclo ForEach-Object di prima - ometti questo se hai già capito.
Parte 5: Pulizia ed esecuzione dello script
Al termine del lavoro, un buon script sa come ripulire se stesso. Ancora una volta, la rimozione delle variabili di seguito non è realmente necessaria se si sta solo andando a eseguire lo script dalla console ma lo si vorrà se si pianifica di eseguirlo nell'ISE.
Remove-Item alias: \ g Remove-Variable ScriptFolder, RequiredFiles, Cognome, Male, FirstName, NumberFormat, Prefisso, Suffisso, ValidInput, UserInputDopo aver completato l'operazione, salvare lo script con estensione ".ps1"nella stessa cartella dei file dei nomi. Assicurati che la tua ExecutionPolicy sia impostata in modo che lo script possa essere eseguito, e dargli un vortice.
Ecco uno screenshot dello script in azione:
È anche possibile scaricare un file ZIP contenente questo script PowerShell e file di testo con elenchi di nomi, dal link sottostante.
Nome casuale &Generatore di numeri di telefono per PowerShell