Quello di cui hai bisogno
Prima di iniziare, ci sono alcuni strumenti e informazioni che dovresti avere:
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. Una grande fonte per a lotto di nomi e informazioni sulla loro popolarità (sebbene ciò non verrà 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 che si utilizza, è 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.
Surnames.txt dovrebbe contenere i cognomi da cui lo script deve essere selezionato. Esempio:
Smith Johnson Williams Jones Brown
Males.txt dovrebbe contenere i nomi maschili di cui si desidera che lo script selezioni. Esempio:
James John Robert Michael William
Females.txt dovrebbe contenere i nomi di battesimo femminili da cui lo script deve essere selezionato. Esempio:
Mary Patricia Linda Barbara Elizabeth
Regole 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 ciascuna 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é il NANP non sta assegnando i prefissi 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 rientra nell'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.
- ForEach-Object prende una matrice, o lista, 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.
- se altro 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.
- interruttore le dichiarazioni sono come se le affermazioni con più scelte. Switch controllerà un oggetto in base a diverse condizioni ed eseguirà 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 a prendere le istruzioni aiutano nella gestione degli errori. Se qualcosa va storto con il blocco di script specificato per try, il blocco catch verrà eseguito.
- Get-Content fa quello che dice sulla scatola.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 genera effettivamente output. Normalmente, questo viene scaricato sulla console ma può anche essere reindirizzato da altri comandi.
Ci sono altri comandi nella sceneggiatura, ma li spiegheremo mentre procediamo.
Costruire lo script
Ora è il momento di sporcarci le mani.
Parte 1: Prepararsi per andare
Se ti piace che lo script inizi a essere eseguito da una console pulita, ecco la prima riga che desideri.
Clear-Host
Ora 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 = Split-Path $MyInvocation.MyCommand.Definition -Parent $RequiredFiles = ('Males.txt','Females.txt','Surnames.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 altro directory di lavoro.
La seconda riga crea una serie di nomi di file che sono 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$_')) { Write-Host '$_ not found.' -ForegroundColor Red $MissingFiles++ } }
Questa porzione 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 là è a non operatore, che inverte la risposta di Test-Path prima di trasmetterla alla dichiarazione 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 correre Percorso di prova '$ ScriptFolder $ _' faremo effettivamente qualcosa di più simile Percorso di prova "C: Scripts Cognomi.txt" (supponendo che lo script sia in C: Scripts e ForEach-Object al momento sta 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 'Could not find $MissingFiles source file(s). Aborting script.' -ForegroundColor Red Remove-Variable ScriptFolder,RequiredFiles,MissingFiles Exit }
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 ti dice 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-Random
Gli alias vengono utilizzati per creare nomi alternativi per i comandi. Questi possono essere utili per aiutarci a familiarizzare con la nuova interfaccia (ad es.: PowerShell ha alias incorporati come dir -> Get-ChildItem e cat -> Get-Content) o per creare riferimenti a mano corta per comandi di uso comune. Qui, stiamo facendo un molto riferimento a mano corta per il Get-Random comando che verrà utilizzato molto più tardi.
Get-Random fa praticamente quello che suggerisce il suo 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 intendendo il più naturale "dammi un numero da 1 a 10" significa veramente "dammi un numero da 0 a 9." Puoi essere più specifico riguardo la selezione del numero, in modo che Get-Random si comporti più come se fossi naturalmente aspettatevi, ma non ne avremo bisogno in questo script.
Parte 2: ottenere input dell'utente e mettersi al lavoro
Mentre uno script che genera un solo nome e numero di telefono casuali è ottimo, è molto meglio se lo script consente all'utente di specificare quanti nomi e numeri vogliono ottenere in un unico batch. Sfortunatamente, non possiamo davvero fidarci degli utenti per dare sempre input validi. Quindi, c'è un po 'di più in questo oltre al semplice $ UserInput = Read-Host.
while (!$ValidInput) { try { [int]$UserInput = Read-Host -Prompt 'Items to be generated' $ValidInput = $true } catch { Write-Host 'Invalid input. Enter a number only.' -ForegroundColor Red } }
L'istruzione while above verifica 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. (Quello è il [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 '`nGenerating $UserInput names & phone numbers. Please be patient.`n' 1..$UserInput | ForEach-Object { <# INSERT RANDOM NAME & NUMBER GENERATOR HERE #> }
Non ti preoccupare, non ti lasceremo da solo per capire il nome casuale e il codice del 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. Il`nall'inizio e alla fine della stringa è necessario inserire una riga vuota prima e dopo quell'output, solo per dargli una separazione visiva tra la riga di input e l'elenco di nomi e numeri. Essere consapevoli del fatto che si tratta di un segno di spunta (AKA "grave accento" - di solito la chiave sopra la scheda, a sinistra di 1) e non un apostrofo o una virgoletta singola di fronte a ciascuna 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, verrà impostato un ciclo regolare come for ($ x = 1; $ x -le $ UserInput; $ x ++) {<# INSERIRE SCRIPT QUI #>}.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 viene eseguito da interi per farlo.
Parte 3: Generazione di un nome casuale
La generazione del nome è la parte più semplice del resto di questo processo. Consiste solo di tre passaggi: scegliere un cognome, scegliere un genere e scegliere un nome. Ricordi quell'alias fatto per Get-Random da un po '? È ora di iniziare a mettere quello da usare.
$Surname = Get-Content '$ScriptFolderSurnames.txt' | g $Male = g 2 if ($Male) {$FirstName = Get-Content '$ScriptFolderMales.txt' | g} else {$FirstName = Get-Content '$ScriptFolderFemales.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 stiamo usando 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 il formato che seguiremo 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 consentono solo di interpretare le variabili prima che una stringa venga emessa, ma ti consentono anche di elaborare blocchi di script. Per farlo, avvolgi il blocco di script in questo modo: "$ (<# SCRIPT QUI #>)". 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 in grado di generare il nostro nome e numero di telefono è di generare un ID sottoscrittore, che verrà archiviato come $ Suffisso.
switch ($NumberFormat) { {$_ -lt 4} {$Suffix = '$(g 10)$(g 10)$(g 10)$(g 10)'} 4 { switch ($Prefix) { '(800) 555' {$Suffix = '0199'} default {$Suffix = '01$(g 10)$(g 10)'} } } }
A causa delle regole speciali per i numeri 555, non possiamo generare solo 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.
Nota che ci sono alcuni modi in cui questo blocco avrebbe potuto essere scritto, invece di 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 è il momento dell'output.
Write-Output '$FirstName $Surname $Prefix-$Suffix' }
Questo è praticamente tanto semplice quanto nella sceneggiatura. 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
Dopo tutto il lavoro è fatto, un buon script sa come ripulire se stesso. Ancora una volta, la rimozione delle variabili di seguito non è veramente necessaria se si sta solo andando a eseguire lo script dalla console ma lo si vorrà se si prevede di eseguirlo nell'ISE.
Remove-Item alias:g Remove-Variable ScriptFolder,RequiredFiles,Surname,Male,FirstName,NumberFormat,Prefix,Suffix,ValidInput,UserInput
Dopo aver completato l'operazione, salva lo script con un'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:
Nome casuale e generatore di numeri di telefono per PowerShell