Начална » как да » Как да генерирате случайни имена и телефонни номера с PowerShell

    Как да генерирате случайни имена и телефонни номера с PowerShell

    Когато имате нужда от набор от данни за тестване или демонстрация, и този набор трябва да представлява лично идентифицираща информация (PII), обикновено не искате да използвате реални данни, които представляват действителните хора. Тук ще ви разгледаме как можете да използвате PowerShell за генериране на списък с случайни имена и телефонни номера за такъв случай.

    От какво имаш нужда

    Преди да започнете, има някои инструменти и информация, които трябва да имате:

    PowerShell

    Този скрипт е разработен с помощта на PowerShell 4.0 и е тестван за съвместимост с PowerShell 2.0. PowerShell 2.0 или по-нова версия е вградена в Windows след Windows 7. Тя е достъпна и за Windows XP и Vista като част от Windows Management Framework (WMF). Някои допълнителни подробности и връзки за изтегляне са по-долу.

    • PowerShell 2.0 се доставя с Windows 7. Потребителите на Windows XP SP3 и Vista (SP1 или по-нова версия) могат да изтеглят съответната версия на WMF от Microsoft в KB968929. Тя не се поддържа от XP SP2 или по-ниска, или Vista без SP1.
    • PowerShell 4.0 идва с Windows 8.1. Потребителите на Windows 7 SP1 могат да го надграждат като част от актуализация на WMF от центъра за изтегляния на Microsoft. Той не е достъпен за XP или Vista.

    Имена

    Ще ви трябват някои списъци с имена, които да се подават в генератора на произволни. Голям източник за много на имена и информация относно тяхната популярност (макар че това няма да се използва за този сценарий), е Бюрото за преброяване на населението на САЩ. Списъците, които се намират на връзките по-долу, са много големи, така че може да искате да ги отрежете малко, ако планирате да генерирате много имена и номера едновременно. На нашата тестова система всяко двойка име / номер отнемаше около 1,5 секунди, за да се генерира чрез пълните списъци, но пробегът ви ще варира в зависимост от собствените ви спецификации на системата.

    • фамилии
    • Мъжки имена
    • Женски имена

    Независимо от източника, който използвате, ще трябва да генерирате три текстови файла, които скриптът може да използва като пулове за избор на име. Всеки файл трябва да съдържа само имена и само едно име на ред. Те трябва да се съхраняват в същата папка като скрипта на PowerShell.

    Surnames.txt трябва да съдържа фамилните имена, от които искате да изберете скрипта. Пример:

    Смит Джонсън Уилямс Джоунс Браун

    Males.txt трябва да съдържа първите имена, които искате да изберете от скрипта. Пример:

    Джеймс Джон Робърт Майкъл Уилям

    Females.txt трябва да съдържа женските първи имена, от които искате да изберете скрипта. Пример:

    Мери Патриша Линда Барбара Елизабет

    Правила за телефонни номера

    Ако искате да сте сигурни, че телефонните ви номера не съвпадат с реалния телефонен номер на никого, най-лесният начин е да използвате добре познатия код за обмен 555. Но ако ще покажете набор от данни с много телефонни номера, 555 ще започне да изглежда доста монотонно бързо. За да направим нещата по-интересни, ще генерираме други телефонни номера, които нарушават правилата на NANP. По-долу са дадени някои примерни невалидни телефонни номера, представляващи всеки клас от номера, който ще бъде генериран от този скрипт:

    • (157) 836-8167
      Този номер е невалиден, тъй като зоните не могат да започнат с 1 или 0.
    • (298) 731-6185
      Този номер е невалиден, защото NANP не присвоява кодове на зони с 9 като втора цифра.
    • (678) 035-7598
      Този номер е невалиден, защото обменните кодове не могат да започват с 1 или 0.
    • (752) 811-1375
      Този номер е невалиден, защото Exchange кодовете не могат да завършват с два 1s.
    • (265) 555-0128
      Този номер е невалиден, защото кодът за обмен е 555, и идентификационният номер на абоната е в обхвата, запазен за фиктивни номера.
    • (800) 555-0199
      Този номер е единственият номер с код за обмен 555, който е запазен за използване като фиктивен номер.

    Имайте предвид, че горните правила подлежат на промяна и могат да варират в зависимост от юрисдикцията. Трябва да направите собствени изследвания, за да проверите настоящите правила, които са приложими за локал, за който ще генерирате телефонни номера.

    Общи команди

    Има някои доста често срещани команди, които ще се използват в този скрипт, така че трябва да получите основна представа за това какво означават те, преди да се потопим в действително писане.

    • ForEach-Object взема масив или списък от обекти и изпълнява зададената операция на всеки от тях. В блока за скриптове ForEach-Object, променливата $ _ се използва за препратка към текущия обработван елемент.
    • ако… друго отчети ви позволяват да извършите операция само ако са изпълнени определени условия и (по избор) да уточните какво трябва да се направи, когато това условие не е изпълнено.
    • ключ изявленията са като изявления с повече възможности за избор. Комутаторът ще провери обект срещу няколко условия и ще изпълни скриптовите блокове, определени за условията, които обектът съвпада. Можете също така, по желание, да зададете блок по подразбиране, който ще се изпълнява само ако не са съчетани други условия. Превключвателните изрази също използват променливата $ _, за да се отнасят към текущия обработван елемент.
    • докато Позволява ви непрекъснато да повтаряте блок скриптове, докато е изпълнено определено условие. След като нещо се случи, което причинява, че условието вече не е вярно, когато блокът на скрипта е завършен, цикълът излиза.
    • опитай да хванеш изявления помагат при обработката на грешки. Ако нещо се обърка със скриптовия блок, зададен за опит, блокиращият блок ще се изпълни.
    • Get-съдържание прави това, което пише на кутията. Той получава съдържанието на определен обект - обикновено файл. Това може да се използва за показване на съдържанието на текстов файл в конзолата или, както е в този скрипт, предаване на съдържанието по тръбопровода, което ще се използва с други команди.
    • Напиши-домакин поставя нещата в конзолата. Това се използва за представяне на съобщения на потребителя и не е включено в изхода на скрипта, ако изходът се пренасочва.
    • Напиши-Output всъщност генерира продукция. Обикновено това се изхвърля към конзолата, но може да бъде пренасочено и от други команди.

    Има и други команди в скрипта, но ние ще ги обясним.

    Изграждане на скрипта

    Сега е време да си замърсим ръцете.

    Част 1: Подготовка за работа

    Ако искате скриптът ви да започне да се изпълнява от чиста конзола, ето първата линия, която искате.

    Clear-домакин

    Сега, когато имаме чист екран, следващото нещо, което искаме да направим, е да проверим скрипта, за да се уверим, че всичко, от което се нуждае, е на място. За да направим това, трябва да започнем с това да му кажем къде да търсим и какво да търсим.

    $ ScriptFolder = Разделяне на пътя $ MyInvocation.MyCommand.Definition -Parent $ RequiredFiles = ('Males.txt', 'Females.txt', 'Фамилии')

    Първият ред е много полезен за всеки скрипт. Той определя променлива, която сочи към папката, съдържаща скрипта. Това е от съществено значение, ако вашият скрипт се нуждае от други файлове, които се намират в същата директория, както самата (или известен относителен път от тази директория), защото иначе ще срещнете грешки, ако и когато се опитате да изпълните скрипта, докато сте в работна директория.

    Вторият ред създава масив от имена на файлове, които са необходими за правилното изпълнение на скрипта. Ще използваме това, заедно с променливата $ ScriptFolder, в следващото парче, където проверяваме дали тези файлове са налице.

    $ RequiredFiles | ForEach-Object if (! (Test-Path "$ ScriptFolder \ _")) Write-Host "$ _ not found." -ForegroundColor Red $ MissingFiles ++

    Тази част от скрипта изпраща масив $ RequiredFiles в блок ForEach-Object. В този скриптов блок, операторът if използва Test-Path, за да види дали файлът, който търсим, е мястото, където принадлежи. Test-Path е проста команда, която, когато се зададе път на файл, връща основна вярна или фалшива реакция, за да ни каже дали пътят сочи към нещо, което съществува. Удивителният знак там е a не оператор, който обръща отговора на Test-Path преди да го предаде на оператора if. Така че, ако Test-Path върне false (тоест, файлът, който търсим не съществува), той ще бъде преобразуван в true, така че операторът if да изпълни своя блок скриптове.

    Друго нещо, което трябва да се отбележи тук, което често ще се използва в този скрипт, е използването на двойни кавички вместо единични кавички. Когато поставяте нещо в единични кавички, PowerShell я третира като статичен низ. Каквото и да е в единичните кавички, ще бъде предадено точно както е. Двойните кавички казват на PowerShell да преведе променливите и някои други специални елементи в низа, преди да го предаде. Тук двойните кавички означават това вместо да се изпълняват Test-Path '$ ScriptFolder \ t  всъщност ще правим нещо повече Тестов път "C: скриптове \ t (ако вашият скрипт е в C: Скриптове, а ForEach-Object понастоящем работи с „Names.txt“).

    За всеки файл, който не е намерен, Write-Host ще публикува съобщение за грешка в червено, за да ви каже кой файл липсва. След това увеличава променливата $ MissingFiles, която ще се използва в следващото парче, за грешка и излизане, ако липсват файлове.

    if ($ MissingFiles) Write-Host "Не може да се намери $ MissingFiles източник файл (а). Прекъсване на скрипт." -ForegroundColor Червена папка за премахване на променливи, задължителни файлове, изход от липсващи файлове

    Ето още един чист трик, който можете да правите с изявления. Повечето ръководства ще видите за това дали операторите ще ви кажат да използвате оператор, за да проверите за съответстващо условие. Например, тук можем да използваме ако ($ MissingFiles -gt 0) за да видите дали $ MissingFiles е по-голямо от нула. Ако обаче вече използвате команди, които връщат булева стойност (както в предишния блок, където използвахме Test-Path), това не е необходимо. Можете да го направите и без него в случаи като този, когато просто тествате дали даден номер не е нула. Всеки ненулен номер (положителен или отрицателен) се третира като вярно, докато нула (или, както може да се случи тук, несъществуваща променлива) ще се третира като невярно.

    Ако $ MissingFiles съществува и не е нула, Write-Host ще публикува съобщение, което ви казва колко файлове липсват и че скриптът ще се прекрати. След това Remove-Variable ще почисти всички променливи, които сме създали и Exit ще излезе от скрипта. В обикновената PowerShell конзола, Remove-Variable не е наистина необходима за тази конкретна цел, защото променливите, зададени от скриптове, обикновено се отхвърлят, когато скриптът излезе. Въпреки това, PowerShell ISE се държи малко по различен начин, така че може да искате да запазите това в, ако планирате да стартирате скрипта от там.

    Ако всички неща са в ред, скриптът ще продължи. Още една подготовка, която трябва да направите, е псевдоним, на който ще се радваме по-късно.

    Нов псевдоним g Get-Random

    Псевдоними се използват за създаване на алтернативни имена за команди. Те могат да бъдат полезни, за да ни помогнат да се запознаем с новия интерфейс (напр .: PowerShell има вградени псевдоними като dir -> Get-ChildItem и cat -> Get-Content) или да прави кратки препратки за често използвани команди. Ето, правим едно много краткосрочно позоваване за. \ t Get-Random команда, която ще бъде използвана много по-късно.

    Get-Random почти прави това, което подсказва името му. Като масив (като списък с имена) като вход, той избира произволен елемент от масива и го изплюва. Може да се използва и за генериране на случайни числа. Нещо, което трябва да запомните за Get-Random и числата е, че подобно на много други компютърни операции, той започва да брои от нула. Така че вместо Get-Random 10 което означава по-естественото „дай ми число от 1 до 10“, което наистина означава „дай ми число от 0 до 9.“ Можеш да бъдеш по-конкретен за избора на номера, така че Get-Random да се държи по-добре като теб очакваме, но няма да имаме нужда от това в този скрипт.

    Част 2: Получаване на потребителско въвеждане и получаване на работа

    Докато скрипт, който генерира само едно произволно име и телефонен номер е страхотен, много по-добре е, ако скриптът позволява на потребителя да определи колко имена и номера искат да получат в една партида. За съжаление, не можем да се доверим на потребителите винаги да дават валидни данни. Така че има малко повече от това $ UserInput = Read-Host.

    докато (! $ ValidInput) try [int] $ UserInput = Read-Host -Prompt 'Точки, които ще бъдат генерирани' $ ValidInput = $ true catch Write-Host 'Невалиден вход. Въведете само номер. ' -ForegroundColor Red

    Изразът while проверява и отрича стойността на $ ValidInput. Докато $ ValidInput е невярна или не съществува, тя ще продължи да върти цикъла през своя скриптов блок.

    Операторът try се въвежда от потребителя чрез Read-Host и се опитва да го преобразува в цяло число. (Това е [Int] преди четене-хост.) Ако е успешен, той ще зададе $ ValidInput на true, така че цикълът while да може да излезе. Ако не е успешно, блокът за улавяне публикува грешка и, защото $ ValidInput не е настроен, цикълът while ще се върне и ще поднови потребителя отново.

    След като потребителят е въвел правилно номер, искаме скриптът да обяви, че е на път да започне действително работата си и след това да го направи.

    Write-Host "'nGenerating $ UserInput вписвания и телефонни номера. Моля, бъдете търпеливи." 1 ... $ UserInput | ForEach-Object 

    Не се притеснявайте, няма да ви оставим сами да разберете кода на генератора на произволни имена и номера. Това е просто коментар, който ще ви покаже къде ще се побере следващия раздел (където се прави истинската работа).

    Линията Write-Host е доста проста. Той просто казва колко имена и телефонни номера ще генерира скриптът и иска от потребителя да бъде търпелив, докато скриптът върши своята работа. Най-"п в началото и в края на низът трябва да вмъкнете празен ред преди и след този изход, просто за да му придадете някакво визуално разграничение между входния ред и списъка с имена и номера. Имайте предвид, че това е обратен кърлежи (AKA „тежък акцент“ - обикновено ключът над раздела, вляво от 1), а не апостроф или единичен цитат пред всеки п.

    Следващата част показва различен начин, по който можете да използвате ForEach-Object цикъл. Обикновено, когато искате блок скрипт да се изпълнява определен брой пъти, ще настроите обикновен за цикъл за ($ x = 1; $ x -le $ UserInput; $ x ++) . ForEach-Object ни позволява да опростим това, като му подадем списък с цели числа, а вместо да кажем, че действително прави нещо с тези цели числа, ние просто им даваме статичен блок за скриптове, който да се изпълнява, докато не изтече цели числа, за да го направят за.

    Част 3: Генериране на произволно име

    Генерирането на името е най-простото нещо от останалата част от този процес. Той се състои само от три стъпки: Избиране на фамилия, избор на пол и избиране на първо име. Помниш ли този псевдоним, който направихме за Гета-Рандом? Време е да започнете да го използвате.

        $ Фамилия = Get-Content "$ ScriptFolder \ t g $ Male = g 2 if ($ Male) $ FirstName = Get-Content "$ ScriptFolder Males.txt" | g else $ FirstName = Get-Content "$ ScriptFolder Females.txt" | д

    Първият ред ни попълва списъка с фамилии, вкарва се в случайния избор и присвоява избраното име на $ Фамилия.

    Вторият ред избира пола на нашия човек. Помниш ли как Get-Random започва да брои от нула и как нула е фалшиво и всичко останало е вярно? Така използваме Get-Random 2 (или много по-кратък g 2 благодарение на нашия псевдоним - и двата имат за резултат избор между нула или едно), за да решим дали човекът е мъж или не. Декларацията if / else след това произволно избира съответно мъжко или женско име.

    Част 4: Генериране на случаен телефонен номер

    Ето наистина забавната част. По-рано ви показахме как можете да направите невалиден или фиктивен телефонен номер по няколко начина. Тъй като не искаме всичките ни номера да изглеждат твърде сходни един с друг, ние ще изберем случайно всеки невалиден формат на числото. Случайно избраните формати ще бъдат дефинирани от техния Код на зоната и кода за обмен, които заедно ще бъдат съхранени като $ Prefix.

        $ NumberFormat = g 5 превключвател ($ 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 "

    Първият ред е просто генериране на случайни числа, за да изберете кой формат ще следваме за телефонния номер. Тогава операторът switch приема този случайен избор и съответно генерира $ Prefix. Помните ли този списък с невалидни типове телефонни номера? Стойностите на $ NumberFormat 0-3 съответстват на първите четири в списъка. Стойност 4 може да генерира една от последните две, тъй като и двете използват “555” Exchange Code.

    Тук можете също да видите, че използваме друг трик с двойни кавички. Двойните кавички не ви позволяват просто да интерпретирате променливи, преди низът да излезе - те също ви позволяват да обработвате скриптове. За да направите това, обгръщайте блока за скриптове по този начин: "$ ()". Така че това, което имате по-горе, е много индивидуално рандомизирани цифри, като някои от тях са или ограничени в обхвата си или са поставени статично в съответствие с правилата, които трябва да следваме. Всеки низ има и скоби и интервали, както обикновено очаквате да видите в чифт код за зона и код за обмяна.

    Последното нещо, което трябва да направим, преди да сме готови да изведем нашето име и телефонен номер, е да генерираме идентификационен номер на абонат, който ще се съхранява като $ Suffix.

        switch ($ NumberFormat) $ _ -lt 4 $ Suffix = "$ (g 10) $ (g 10) $ (g 10) $ (g 10)" 4 превключвател ($ Prefix) '( 800) 555 '$ Suffix =' 0199 ' по подразбиране $ Suffix = "01 $ (g 10) $ (g 10)"

    Поради специалните правила за 555 номера, не можем просто да генерираме четири случайни цифри за края на всеки телефонен номер, който нашият скрипт ще направи. Така че, първият превключвател проверява дали имаме работа с 555 номер. Ако не, то генерира четири случайни цифри. Ако номерът е 555, вторият превключвател проверява кода на областта 800. Ако това съвпада, има само един валиден $ Suffix, който можем да използваме. В противен случай е позволено да избирате от нищо между 0100-0199.

    Имайте предвид, че има няколко различни начина, по които този блок би могъл да бъде написан, вместо начина, по който е. И двете превключвателни изрази можеха да бъдат заменени с изрази if / else, тъй като всеки един от тях само обработва два избора. Също така, вместо да извикваме конкретно „4” като опция за първото превключващо изявление, „по подразбиране” можеше да се използва подобно на това, което беше направено през второто, тъй като това беше единствената останала опция. Изборът между if / else vs. switch или къде да се използва ключовата дума по подразбиране, вместо конкретни стойности, често се свежда до лични предпочитания. Докато работи, използвайте каквото ви е най-удобно.

    Сега е време за изход.

        Write-Output "$ FirstName $ Фамилия $ Prefix-$ Sufix"

    Това е почти толкова просто, колкото в сценария. Той просто извежда първото и последното име, разделени с интервали, а след това друго пространство пред телефонния номер. Ето къде се добавя стандартното тире между кода на Exchange и идентификатора на абоната.

    Тази затваряща скоба в долната част е краят на цикъла ForEach-Object от по-рано - пропуснете го, ако вече го имате.

    Част 5: Почистване и стартиране на скрипта

    След като свърши цялата работа, един добър сценарий знае как да почисти след себе си. Отново, премахването на променливата по-долу не е наистина необходимо, ако само ще изпълните скрипта от конзолата, но ще го искате, ако някога планирате да го изпълните в ISE.

    Псевдоним за премахване на променлива: Премахване на променлива ScriptFolder, RequiredFiles, Фамилия, Мъж, Първо име, NumberFormat, Префикс, Суфикс, ValidInput, UserInput

    След като сте направили всичко, запишете скрипта с разширение ".ps1" в същата папка като файловете с имена. Уверете се, че Вашата ExecutionPolicy е настроена така, че скриптът да може да се изпълнява, и да му даде вихър.

    Ето снимка на скрипта в действие:

    Можете също така да изтеглите ZIP файл, съдържащ този скрипт на PowerShell, и текстови файлове с списъци с имена от връзката по-долу.

    Случайни име и генератор на телефонни номера за PowerShell