PowerShell и другие скрипты

8.4.2008

Scripting Games: Sudden Death Challenge - Events 8 & 9

Рубрика: Learn, PowerShell, Scripting, Scripting Games — Xaegr @ 12:39

Эти два задания явно слишком просты для отдельных постов, поэтому я опишу их в одном :)

В Event 8 требовалось найти соответствия имен параметров в LDAP, таковым в консоли Active Directory Users and Computers. Задачка не сложная, и решить её можно просто задав параметры пользователю, и посмотрев на него в консоли adsiedit.msc. Но можно еще проще:

[PS <72> C:\Root] Get-QADUser gusev | Format-List *

objectClass                     : {top, person, organizationalPerson, user}
sn                              : Гусев
telephoneNumber                 : 120
givenName                       : Василий
… неинтересные параметры поскипаны …

Единственная проблема была со страной, так как она задается в 2х параметрах: c и cn. Но указание в ответе обоих - прокатило :) Подробнее у MoW (он кстати использовал родной функционал PowerShell, полезно посмотреть).

Ну и в Event 9 было вообще смешное задание: убрать из строки все “мусорные” символы, оставив одну фразу:

T#$h!e ()200$~``8 W,\i|n<:;>t.?e&^%-r S#=_cri??{}p()-t@@@i|[[ng G!@!am=_+e^%s/.,

Применяем оператор -replace с простеньким регулярным выражением (все символы кроме букв a-z, пробелов и цифр):

(gc "C:\scripts\symbols.txt") -replace "[^a-z \d]"

И получаем “The 2008 Winter Scripting Games”. Всё :)

1.4.2008

Scripting Games: Sudden Death Challenge - Event 7

Рубрика: Learn, PowerShell, Scripting, Scripting Games — Xaegr @ 7:48

sd7

Sudden Death 7. Тут я понаписал много лишнего кода :)

#Считаем и выводим результат на консоль. $result = "{0:n2}" -f ([math]::Sqrt([math]::Pow([math]::Floor(100*2/30),5)*4)/45) Write-Host $result # Создаем объект Speech Agent’а $agent = New-Object -com Agent.Control.2 # Не знаю зачем, тупо содрал откуда то :) Может и не нужно вообще :) $agent.Connected = 1 # Подгружаем персонажа. $agent.Characters.Load("Merlin") | Out-Null # Помещаем его в переменную. $merlin = $agent.Characters.Character("Merlin") # Показываем на экране. $merlin.Show() | Out-Null # Говорим :) $merlin.Speak("Result of equation is $result.") | Out-Null

Для сравнения стоит посмотреть как решил MoW. Ну и конечно официальное решение.

24.3.2008

Scripting Games: Sudden Death Challenge - Event 6

Рубрика: Learn, PowerShell, Scripting, Scripting Games — Xaegr @ 15:47

Тоже достаточно простая задачка

SD6.ps1
# Преобразуем содержимое файла в массив символов, и потом снова в строки, # разрубив таким образом на строки по одному символу. Можно было сделать -split "" :) # Ну и эта последовательность строчек идет в switch с аргументами проверки по # регулярным выражениям, и чувствительности к регистру символов. $(switch -regex -casesensitive ([string[]][char[]](gc "c:\scripts\lettercase.txt")) { # Если строчная буква, то переводим в верхний регистр… "^[a-z]$" {$_.toUpper()} # … и наоборот. "^[A-Z]$" {$_.toLower()} # Если цифра, то преобразовываем в число ([int]) и прибавляем единицу. "^\d$" {[int]$_ - 1} # Иначе - передаем без изменений. default {$_} # Объединяем в строку. }) -join ""

Ну и смотрим вариант MoW (почти 1 в 1 с моим ;) ) и официальный.

21.3.2008

Scripting Games: Sudden Death Challenge - Event 5

Рубрика: Learn, PowerShell, Scripting, Scripting Games — Xaegr @ 9:48

sd5

Решая эту задачку я совсем забыл про [wmiclass] и использовал вместо него system.management.managementClass…

 

SD5.ps1
# Объявляем хэш-таблицу. $h = @{} # Получаем список WMI объектов. Get-WmiObject -List | # отбираем только начинающиеся на win32_ и заодно проверяем не заполнена ли уже # хэш-таблица. Where-Object {$_.Name -like "win32_*" -and $h.count -ne 25}| # Для каждого отобранного объекта… ForEach-Object { # … помещаем имя класса в переменную $Class. $Class=$_.name; # Создаем .net объект System.Management.ManagementClass для текущего класса… (New-Object system.management.managementClass($Class)).psbase.properties | # …и отбираем из всех его свойств поле Name, которое передаем дальше по # конвейеру. ForEach-Object {$_.Name} }| # Для каждого полученного по конвейеру свойства… foreach { #… если оно начинается с нужных букв (^ - обозначает начало строки, а [a-y] # любой символ от a до y. Скобки в регулярном выражении помещают первый # символ слова в $Matches[1]). if ($_ -match "^([a-y])") { # Если в хэш-таблице еще нет указанной буквы… if (!$h[$matches[1]]) { # Помещаем текущее свойство в переменную $Prop $prop = $_ # Создаем новый объект со свойствами Letter, Property и Class, # который помещаем в хэш-таблицу под соответствующей буквой. $h[$matches[1]]=0|select @{n="Letter";e={$matches[1]}}, @{n="Property";e={$prop}}, @{n="Class";e={$class}} } # Пишем в заголовке текущий сколько уже нашли свойств и текущий класс. $host.ui.rawui.windowtitle = "$($h.count)/25 - $Class.$_" } } # Красиво выводим результаты. $h.values | Sort-Object letter | Format-Table -AutoSize

Обязательно посмотреть оба варианта MoW.

20.3.2008

Scripting Games: Sudden Death Challenge - Event 4

Рубрика: Learn, PowerShell, Scripting, Scripting Games — Xaegr @ 10:53

Задача - получить из 6882463283678273808479 строку “DR. SCRIPTO”. Ерунда ;)

 

SD4.ps1
$(foreach($c in([char[]](gc C:\scripts\numbers.txt))){[char][int]"$c$($foreach.movenext()|out-null;$foreach.current)"})-join”

Но вот разобрать и прокомментировать этот ужас куда сложнее… И поэтому я просто переписал ту же логику заново, но более понятно :)

 

SD4_easy.ps1
# Инициализируем переменную $Result для хранения итоговой строки. $Result = "" # Получаем содержимое файла в переменную. $stringNumbers = Get-Content "C:\scripts\numbers.txt" # Преобразуем строку в массив символов $charNumbers = [char[]]$stringNumbers # Для каждого символа в массиве… foreach ($FirstNumber in $charNumbers) { # Сдвигаем перебор на одну итерацию вперед с помощью метода MoveNext() # специального объекта $ForEach (который доступен только внутри цикла foreach. $Foreach.MoveNext() | Out-Null # Помещаем следующий символ в переменную $SecondNumber. $SecondNumber = $Foreach.Current # Объединяем оба номера в число, которое и является кодом символа. [int]$CharCode = $FirstNumber+$SecondNumber # Преобразовываем число в символ, и добавляем к $Result. $Result += [char]$CharCode } # Выводим результат. $Result

Кстати у MoW получилось еще короче и красивее.

Older Posts »

Заведите блог на WordPress.com.