От какво имаш нужда
Преди да започнете, има някои инструменти и информация, които трябва да имате:
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 трябва да съдържат имената, от които искате да изберете скрипта. Пример:
Smith Johnson Williams Jones Brown
Males.txt трябва да съдържат имената на мъжете, от които искате да изберете скрипта. Пример:
James John Robert Michael William
Females.txt трябва да съдържат женските имена, от които искате да изберете скрипта. Пример:
Mary Patricia Linda Barbara Elizabeth
Правила за телефонни номера
Ако искате да сте сигурни, че телефонните ви номера не съвпадат с истинския телефонен номер на някой, най-лесният начин е да използвате добре познатия "555" Exchange Code. Но ако искате да показвате набор от данни с много телефонни номера, 555 ще изглежда доста монотонен. За да направим нещата по-интересни, ще генерираме други телефонни номера, които нарушават правилата на Северноамериканския номерационен план (NANP). По-долу са дадени примерни невалидни телефонни номера, представляващи всеки клас номер, който ще бъде генериран от този скрипт:
- (157) 836-8167 Това число е невалидно, тъй като кодовете на района не могат да започват с 1 или 0.
- (298) 731-6185 Този номер е невалиден, тъй като NANP не приписва кодовете на областта с 9 като втора цифра.
- (678) 035-7598 Това число е невалидно, защото Exchange Codes не може да започне с 1 или 0.
- (752) 811-1375 Този номер е невалиден, защото Exchange Codes не може да завърши с два 1s.
- (265) 555-0128 Този номер е невалиден, защото кодът на Exchange е 555, и идентификационният номер на абоната е в обхвата, запазен за фиктивни номера.
- (800) 555-0199 Този номер е единственото 800 число с 555 кода на Exchange, който е запазен за използване като фиктивен номер.
Обърнете внимание, че горепосочените правила подлежат на промяна и могат да се различават по юрисдикция. Трябва да направите собствено проучване, за да проверите настоящите правила, приложими към локала, за които ще генерирате телефонни номера.
Общи команди
Има някои доста общи команди, които ще бъдат използвани в целия скрипт, така че трябва да получите основна представа за това какво означават това, преди да се впуснем в действителното му писане.
- ForEach-Object взема масив или списък от обекти и изпълнява зададената операция на всеки от тях. В рамките на блок за скриптове ForEach-object, променливата $ _ се използва за препращане към текущия обект, който се обработва.
- ако … друго изявленията ви позволяват да извършите операция само ако са изпълнени определени условия и (по желание) уточнете какво трябва да се направи, когато това условие не е изпълнено.
- ключ изявленията са като изявления с по-голям избор. Превключвателят ще провери даден обект срещу няколко условия и ще изпълни каквито и да са скриптови блокове за условията, които съответстват на обекта. Можете също така по избор да зададете блок по подразбиране, който да се изпълнява само ако не са съвпадали други условия. Протоколите за превключване също използват променливата $ _, за да се отнасят до текущия обект, който се обработва.
- докато изявленията ви позволяват непрекъснато да повтаряте блока на скрипта, стига да бъде изпълнено определено условие. Щом се случи нещо, което причинява, че условието вече не е вярно, когато сценарият блок завърши, изходът излезе.
- опитай да хванеш изявленията помагат при обработката на грешки. Ако нещо се обърка с блока от скриптове, зададен за изпробване, блокът за улова ще се изпълни.
- Get-съдържание прави това, което казва на калай.Той получава съдържанието на определен обект - обикновено файл. Това може да се използва за показване на съдържанието на текстов файл в конзолата или, както в този скрипт, да предава съдържанието по тръбопровода, което да се използва с други команди.
- Напиши-домакин поставя неща в конзолата. Това се използва за представяне на съобщения до потребителя и не се включва в изхода на скрипта, ако изходът се пренасочва.
- Напиши-Output всъщност генерира продукция. Обикновено това се изхвърля в конзолата, но може да бъде пренасочено и от други команди.
Има и други команди в сценария, но ние ще ги обясним, докато вървим.
Изграждане на скрипта
Сега е време да замръзнем ръцете си.
Част 1: Готовност за пътуване
Ако искате скриптът ви да започне да се изпълнява от чиста конзола, тук е първата линия, която искате в него.
Clear-Host
Сега, когато имаме чист екран, следващото нещо, което искаме да направим, е да проверим скрипта, за да сме сигурни, че всичко, от което се нуждае, е на мястото си. За да направите това, трябва да започнете, като му кажете къде да търсите и какво да търсите.
$ScriptFolder = Split-Path $MyInvocation.MyCommand.Definition -Parent $RequiredFiles = ('Males.txt','Females.txt','Surnames.txt')
Първият ред там е много полезен за всеки скрипт. Тя определя променлива, която сочи към папката, съдържаща скрипта. Това е от съществено значение, ако вашият скрипт се нуждае от други файлове, които са разположени в същата директория като самата (или известна относителна пътека от тази директория), защото в противен случай ще срещнете грешки, ако и когато опитате да стартирате скрипта, докато сте в друга работна директория.
Вторият ред създава масив от имена на файлове, които са необходими, за да може скриптът да работи правилно. Ще използваме това, заедно с променливата $ ScriptFolder, в следващото парче, където проверяваме, за да сме сигурни, че файловете са налице.
$RequiredFiles | ForEach-Object { if (!(Test-Path '$ScriptFolder$_')) { Write-Host '$_ not found.' -ForegroundColor Red $MissingFiles++ } }
Тази част от скрипта изпраща масива $ RequiredFiles в блок ForEach-Object. В този скрипт блок, if statement използва Test-Path, за да види дали файлът, който търсим, е мястото, където то принадлежи. Тестовата пътека е проста команда, която при даден път на файл връща основен истински или фалшив отговор, за да ни каже дали пътят сочи към нещо, което съществува. Удивителната точка там е не оператор, който обръща реакцията на Test-Path, преди да го предаде на изявлението if. Така че, ако Test-Path връща false (т.е. файлът, който търсим, не съществува), той ще бъде преобразуван в true, така че if statement ще изпълни своя скрипт блок.
Друго нещо, което трябва да се отбележи тук, което ще се използва често в този скрипт, е използването на двойни кавички вместо единични кавички. Когато поставите нещо в единични кавички, PowerShell го третира като статичен низ. Каквото и да е в единичните котировки ще бъде предадено точно както е. Двойните кавички указват на PowerShell да превежда променливите и някои други специални елементи в низа, преди да ги предаде. Тук двойните кавички означават, че вместо да се изпълняват Test-Path '$ ScriptFolder $ _' всъщност ще правим нещо повече Test-Path "C: Scripts Surnames.txt" (при условие, че вашият скрипт е в C: Scripts, а ForEach-Object понастоящем работи върху 'Surnames.txt').
За всеки файл, който не е намерен, писател-домакин ще публикува съобщение за грешка в червено, за да ви каже кой файл липсва. След това се увеличава променливата $ MissingFiles, която ще бъде използвана в следващото парче, за грешка и ще се напусне, ако липсват файлове.
if ($MissingFiles) { Write-Host 'Could not find $MissingFiles source file(s). Aborting script.' -ForegroundColor Red Remove-Variable ScriptFolder,RequiredFiles,MissingFiles Exit }
Ето още един чист трик, който можете да направите с изявления. Повечето ръководства, за които ще видите дали изявленията ще ви кажат да използвате оператор, за да проверите съответното условие. Например, тук можем да използваме ако ($ MissingFiles -gt 0) за да видите дали $ MissingFiles е по-голяма от нула. Ако обаче вече използвате команди, които връщат булева стойност (както в предишния блок, където използвахме Test-Path), това не е необходимо. Можете също така да го правите и в такива случаи, когато просто тествате, за да видите дали даден номер не е нулев. Всяко ненулево число (положително или отрицателно) се счита за вярно, докато нула (или, както може да се случи тук, несъществуваща променлива), ще се счита за невярно.
Ако $ MissingFiles съществува и е ненулева, Host-домакин ще публикува съобщение, което ще ви каже колко файла липсват и че скриптът ще бъде прекратен. Тогава Remove-Variable ще изчисти всички променливи, които сме създали, а Exit ще напусне скрипта. На обикновената конзола PowerShell, Remove-Variable не е необходима за тази конкретна цел, тъй като променливите, зададени от скриптове, обикновено се изхвърлят, когато скриптът излезе. Въпреки това, PowerShell ISE се държи малко по-различно, така че може да искате да запазите това, ако планирате да изпълните скрипта от там.
Ако всичко е наред, скриптът ще продължи. Още една подготовка, която трябва да направите, е псевдоним, който наистина ще се радваме да имаме по-късно.
New-Alias g Get-Random
Псевдонимите се използват за създаване на алтернативни имена за команди. Те могат да ни помогнат да се запознаем с новия интерфейс (например: PowerShell има вградени псевдоними като dir -> Get-ChildItem и котка -> Получете съдържание) или да направите кратки справки за често използвани команди. Ето, правим едно много кратка референция за Get-Random команда, която ще бъде използвана много по-късно.
Get-Random почти прави това, което подсказва името му. Като даде масив (като списък с имена) като вход, той избира произволен елемент от масива и го изплюва. Той може да се използва и за генериране на произволни номера. Онова, което трябва да си спомняте за Get-Random и номерата обаче, е, че както много други компютърни операции, то започва да брои от нула. Така че вместо Get-Random 10 което означава, че по-естественото "дай ми номер от 1 до 10", това наистина означава "дай ми число от 0 до 9." Можеш да бъдеш по-конкретен за избор на номер, така че Get-Random се държи по-скоро като теб естествено очакват, но няма да имаме нужда от това в този скрипт.
Част 2: Получаване на потребителски вход и получаване на работа
Докато скрипт, който генерира само едно произволно име и телефонен номер, е много по-добре, ако скриптът позволява на потребителя да определи колко имена и номера искат да получат в една партида. За съжаление, не можем да вярваме, че потребителите винаги дават валидни данни. Така че, има малко малко повече от това $ 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 } }
Изпълнението на горната част проверява и отрича стойността на $ ValidInput. Докато $ ValidInput е фалшив или не съществува, той ще продължи да прекъсва блока си за скриптове.
Изпитанието извежда потребителския вход, чрез Read-Host, и се опитва да го преобразува до целочислена стойност. (Това е [Int] преди Read-Host.) Ако успее, ще зададе $ ValidInput на true така, че while loop може да излезе. Ако не е успешен, блокът за улов подава грешка и, тъй като $ ValidInput не е зададен, секунната линия ще се върне наоколо и ще подкани отново потребителя.
След като потребителят даде подходящо число като вход, искаме скриптът да обяви, че е на път да започне да прави действията си и след това да го направи.
Write-Host '`nGenerating $UserInput names & phone numbers. Please be patient.`n' 1..$UserInput | ForEach-Object { <# INSERT RANDOM NAME & NUMBER GENERATOR HERE #> }
Не се притеснявайте, няма да ви оставяме сами, за да разберете кода на генератора на случайни имена и номера. Това е просто коментар на мястото, което ще ви покаже къде ще се побере следващата секция (където се извършва истинската работа).
Линията "Гост-писател" е доста ясна. Той просто казва колко имена и телефонни номера скриптът ще генерира и моли потребителя да бъде търпелив, докато скриптът върши своята работа. Най-`пв началото и в края на низа трябва да се постави празна линия преди и след изхода, само за да се даде някакво визуално разграничение между входната линия и списъка с имената и номерата. Имайте предвид, че това е отрицателен (AKA "тежък акцент" - обикновено ключовете над раздела, отляво на 1), а не апостроф или единичен цитат пред всеки п.
Следващата част показва различен начин, по който можете да използвате цикъл ForEach-Object. Обикновено, когато искате блокиране на скриптове да се изпълнява определен брой пъти, ще настроите редовно за цикъл за $ ($ x = 1; $ x -le $ UserInput; $ x ++) {<# INSERT SCRIPT HERE #>}.ForEach-Object ни позволява да опростим това, като му дадем списък с цели числа и вместо да му кажем, че действително да прави нищо с тези цели числа, ние просто му даваме статичен скрипт блок, който да тича, докато не изтече цели числа, за да го направи.
Част 3: Генериране на произволно име
Генерирането на името е най-простият бит за останалата част от този процес. Тя се състои само от три стъпки: Избиране на фамилия, избор на пол и избор на собствено име. Не забравяйте, че псевдоним, който направихме за Get-Random за известно време? Време е да започнете да го използвате.
$Surname = Get-Content '$ScriptFolderSurnames.txt' | g $Male = g 2 if ($Male) {$FirstName = Get-Content '$ScriptFolderMales.txt' | g} else {$FirstName = Get-Content '$ScriptFolderFemales.txt' | g}
Първият ред взема нашия списък с фамилни имена, зарежда го в случаен избор и назначава избраното име на $ Фамилия.
Вторият ред избира пола на нашия човек. Спомнете си как Get-Random започва да брои от нула и колко нула е невярна и всичко останало е вярно? Ето как използваме Get-Random 2 (или много по-кратко g 2 благодарение на нашия псевдоним - и двата водят до избор между нула или един), за да решим дали нашият човек е мъж или не. След това изявлението if / else избира произволно мъжко или женско име.
Част 4: Генериране на произволен телефонен номер
Това е наистина забавната част. По-рано ви показахме как има няколко начина, по които можете да направите невалиден или фиктивен телефонен номер. Тъй като не искаме всичките ни цифри да изглеждат твърде сходни един с друг, всеки път случайно ще избираме невалиден формат. Произволно избраните формати ще бъдат дефинирани от техния регионален код и кода на Exchange, които заедно ще се съхраняват като $ 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'} }
Първият ред е директно генериране на случайни номера, за да изберете кой формат ще следваме за телефонния номер. След това изявлението за превключвателя взема този произволен избор и съответно генерира $ Prefix. Помнете ли списъка с невалидни типове телефонни номера? Стойностите $ NumberFormat 0-3 съответстват на първите четири в списъка. Стойност 4 може да генерира една от последните две, тъй като и двете използват "555" Exchange Code.
Тук можете също да видите, че използваме друг трик с двойни кавички. Двойните кавички не само ви позволяват да интерпретирате променливи, преди низът да излезе - те също така ви позволяват да обработвате блокове за скриптове. За да направите това, обвийте блока на скрипта така: "$ (<# SCRIPT HERE #>)", Така че това, което имате по-горе, е много индивидуално рандомизирани цифри, като някои от тях са или ограничени в обхвата си, или определени статично според правилата, които трябва да следваме. Всеки низ има и скоби и разстояния, както нормално очаквахте да видите в двойка код и двоен код.
Последното нещо, което трябва да направим, преди да сме готови да изведем името и телефонния ни номер, е да генерирам идентификационен номер на абоната, който ще се съхранява като $ Suffix.
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)'} } } }
Поради специалните правила за 555 номера не можем да генерираме само четири случайни цифри за края на всеки телефонен номер, който нашият скрипт ще направи. Така че първият превключвател проверява дали имаме работа с 555 номер. Ако не, генерира четири произволни цифри. Ако е номер 555, вторият превключвател проверява за 800 регионален код.Ако това съвпада, има само един валиден $ Suffix, който можем да използваме. В противен случай, тя може да избира от всичко между 0100-0199.
Имайте предвид, че има няколко различни начина, по които този блок би могъл да бъде написан, вместо по начина, по който е. И двете изявления на превключвателите биха могли да бъдат заменени с изрази if / else, тъй като всеки един от тях се занимава само с два избора. Също така, вместо да извикате "4" като опция за първия инструмент за превключване, "по подразбиране" би могъл да бъде използван подобно на начина, по който е бил направен във втория, тъй като това е единствената опция, останала. Изборът между ако / против превключване или къде да се използва ключовата дума по подразбиране вместо конкретни стойности често се свежда до въпрос на лични предпочитания. Докато работи, използвайте каквото си най-удобно.
Сега е време за продукция.
Write-Output '$FirstName $Surname $Prefix-$Suffix' }
Това е почти толкова просто, колкото и в скрипта. Той просто извежда името и фамилията, разделени с интервали, а след това друго място преди телефонния номер. Ето къде се добавя и стандартното тире между Exchange Code и Subscriber ID.
Тази заключваща скоба в долната част е края на цикъла ForEach-Object от по-рано - пропуснете това, ако вече сте го получили.
Част 5: Почистване и изпълнение на скрипта
След като свърши цялата работа, добър скрипт знае как да се чисти след себе си. Отново промяната на промяната по-долу не е необходима, ако само ще стартирате скрипта от конзолата, но ще я искате, ако някога планирате да я стартирате в ISE.
Remove-Item alias:g Remove-Variable ScriptFolder,RequiredFiles,Surname,Male,FirstName,NumberFormat,Prefix,Suffix,ValidInput,UserInput
След като свършите всичко, запазете скрипта с разширение.ps1 в същата папка, в която се намират файловете с имена. Уверете се, че вашият ExecutionPolicy е настроен така, че скриптът да може да се изпълнява и да му се даде вихър.
Ето екранна снимка на скрипта в действие:
Произволно име и генератор на телефонен номер за PowerShell