Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Текстуални излаз команди у прозору тумача ПоверСхелл је само начин да се информације прикажу у облику погодном за људску перцепцију. Заправо среда оријентисана за рад са објектима: цмдлет и функције их примају као улаз и вратио на излазу, а типови променљивих доступни интерактивно и у скриптама су засновани на .НЕТ класама. У четвртом чланку серије детаљније ћемо проучити рад са објектима.

Оглашение:

Објекти у ПоверСхелл-у
Сагледавање структуре објеката
Филтрирање објеката
Сортирање објеката
Одабир предмета и њихових делова
За сваки објекат, групни објекат и објекат мере
Креирање .НЕТ и ЦОМ објеката (Нев-Објецт)
Позивање статичких метода
Откуцајте ПСЦустомОбјецт
Креирање сопствених часова

Објекти у ПоверСхелл-у

Подсетимо се да је објекат скуп поља података (особина, догађаја итд.) и метода за њихову обраду (метода). Његова структура је одређена типом, који се обично заснива на класама које се користе у обједињеној .НЕТ Цоре платформи. Такође је могућ рад са ЦОМ, ЦИМ (ВМИ) и АДСИ објектима. Својства и методе су потребне за обављање различитих радњи над подацима; поред тога, у ПоверСхелл-у, објекти се могу прослеђивати као аргументи функцијама и цмдлет-има, додељивати њихове вредности променљивама, а постоји и механизам састава команде (транспортер или цевовод). Свака команда у цевоводу преноси свој излаз следећој редом, објекат по објекат. За обраду можете користити компајлиране цмдлете или креирати сопствене напредне функцијеза обављање разних манипулација са објектима у цевоводу: филтрирање, сортирање, груписање, па чак и промена њихове структуре. Пренос података у овом облику има озбиљну предност: тим који прима не треба да анализира ток бајтова (текста), све потребне информације се лако преузимају позивањем одговарајућих својстава и метода.

Сагледавање структуре објеката

На пример, покренимо Гет-Процесс цмдлет, који вам омогућава да добијете информације о процесима који се покрећу у систему:

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Приказаће неке форматиране текстуалне податке који не дају никакву представу о својствима враћених објеката и њихових метода. Да бисмо фино подесили излаз, морамо да научимо како да испитамо структуру објеката, а Гет-Мембер цмдлет ће нам помоћи у томе:

Get-Process | Get-Member

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Овде већ видимо тип и структуру, а уз помоћ додатних параметара можемо, на пример, приказати само својства објекта који је укључен у унос:

Get-Process | Get-Member -MemberType Property

Ово знање ће бити потребно за интерактивно решавање проблема администрације или за писање сопствених скрипти: на пример, за добијање информација о закаченим процесима користећи својство Респондинг.

Филтрирање објеката

ПоверСхелл дозвољава да објекти који испуњавају одређени услов прођу кроз цевовод:

Where-Object { блок сценария }

Резултат извршавања блока скрипте унутар заграда мора бити логичка вредност. Ако је тачно ($труе), објекат који је унет у команду Вхере-Објецт биће прослеђен дуж цевовода, у супротном ($фалсе) биће обрисан. На пример, да прикажемо листу заустављених услуга Виндовс Сервера, тј. они чије је својство Статус подешено на „Заустављено“:

Get-Service | Where-Object {$_.Status -eq "Stopped"}

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Овде поново видимо текстуални приказ, али ако желите да разумете тип и унутрашњу структуру објеката који пролазе кроз цевовод, то није тешко:

Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Сортирање објеката

Приликом цевоводне обраде објеката, често постоји потреба за њиховим сортирањем. Команди Сорт-Објецт се прослеђују имена својстава (кључеви за сортирање) и враћају објекте поређане према њиховим вредностима. Лако је сортирати излаз покренутих процеса према утрошеном ЦПУ времену (својство процесора):

Get-Process | Sort-Object –Property cpu

Параметар -Проперти се може изоставити када се позива Сорт-Објецт цмдлет; користи се подразумевано. За обрнуто сортирање, користите параметар -Десцендинг:

Get-Process | Sort-Object cpu -Descending

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Одабир предмета и њихових делова

Селецт-Објецт цмдлет вам омогућава да изаберете одређени број објеката на почетку или крају цевовода помоћу параметара -Фирст или -Ласт. Уз његову помоћ можете одабрати појединачне објекте или одређена својства, а такође и креирати нове објекте на основу њих. Погледајмо како цмдлет функционише на једноставним примерима.

Следећа команда приказује информације о 10 процеса који троше максималну количину РАМ-а (ВС својство):

Get-Process | Sort-Object WS -Descending | Select-Object -First 10

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Можете одабрати само одређена својства објеката који пролазе кроз цевовод и креирати нове на основу њих:

Get-Process | Select-Object ProcessName, Id -First 1

Као резултат рада цевовода, добићемо нови објекат чија ће се структура разликовати од структуре коју враћа Гет-Процесс цмдлет. Хајде да ово проверимо користећи Гет-Мембер:

Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Имајте на уму да Селецт-Објецт враћа један објекат (-Фирст 1) који има само два поља која смо навели: њихове вредности су копиране из првог објекта који је у цевовод проследио Гет-Процесс цмдлет. Један од начина за креирање објеката у ПоверСхелл скриптама је заснован на коришћењу Селецт-Објецт:

$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Користећи Селецт-Објецт, можете додати израчуната својства објектима који треба да буду представљени као хеш табеле. У овом случају, вредност његовог првог кључа одговара имену својства, а вредност другог кључа одговара вредности својства за тренутни елемент цевовода:

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Погледајмо структуру објеката који пролазе кроз транспортер:

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

За сваки објекат, групни објекат и објекат мере

Постоје и друге цмдлет команде за рад са објектима. Као пример, хајде да причамо о три најкориснија:

ФорЕацх-Објецт омогућава вам да покренете ПоверСхелл код за сваки објекат у цевоводу:

ForEach-Object { блок сценария }

Група-Објекат групише објекте по вредности својства:

Group-Object PropertyName

Ако га покренете са параметром -НоЕлемент, можете сазнати број елемената у групама.

Мера-Објекат агрегира различите збирне параметре према вредностима поља објекта у цевоводу (израчунава збир, а такође проналази минималну, максималну или просечну вредност):

Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum

Типично, цмдлети о којима се говори се користе интерактивно и често се креирају у скриптама. funkcije са блоковима Почетак, Процес и Крај.

Креирање .НЕТ и ЦОМ објеката (Нев-Објецт)

Постоји много софтверских компоненти са .НЕТ Цоре и ЦОМ интерфејсима које су корисне администраторима система. Користећи класу Систем.Диагностицс.ЕвентЛог, можете управљати системским евиденцијама директно из Виндовс ПоверСхелл-а. Хајде да погледамо пример креирања инстанце ове класе помоћу команде Нев-Објецт са параметром -ТипеНаме:

New-Object -TypeName System.Diagnostics.EventLog

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Пошто нисмо навели конкретан дневник догађаја, резултујућа инстанца класе не садржи податке. Да бисте ово променили, потребно је да позовете посебан метод конструктора током његовог креирања помоћу параметра -АргументЛист. Ако желимо да приступимо дневнику апликације, требало би да проследимо стринг "Апплицатион" као аргумент конструктору:

$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Имајте на уму да смо сачували излаз команде у променљивој $АппЛог. Иако се цевоводи обично користе у интерактивном режиму, писање скрипти често захтева одржавање референце на објекат. Поред тога, основне .НЕТ Цоре класе су садржане у Систем именском простору: ПоверСхелл подразумевано тражи одређене типове у њему, тако да је писање Диагностицс.ЕвентЛог уместо Систем.Диагностицс.ЕвентЛог сасвим исправно.

Да бисте радили са дневником, можете користити одговарајуће методе:

$AppLog | Get-Member -MemberType Method

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Рецимо да је обрисан методом Цлеар() ако постоје права приступа:

$AppLog.Clear()

Нев-Објецт цмдлет се такође користи за рад са ЦОМ компонентама. Има их доста - од библиотека које се испоручују са Виндовс сервером скрипти до АцтивеКс апликација, као што је Интернет Екплорер. Да бисте креирали ЦОМ објекат, потребно је да поставите параметар -ЦомОбјецт са програмским ПрогИд-ом жељене класе:

New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

Да бисте креирали сопствене објекте са произвољном структуром, коришћење Нев-Објецт изгледа превише архаично и гломазно; овај цмдлет се користи за рад са софтверским компонентама које нису у односу на ПоверСхелл. У будућим чланцима о овом питању ће се детаљније говорити. Поред .НЕТ и ЦОМ објеката, истражићемо и ЦИМ (ВМИ) и АДСИ објекте.

Позивање статичких метода

Неке .НЕТ Цоре класе се не могу инстанцирати, укључујући Систем.Енвиронмент и Систем.Матх. Су статичне и садрже само статичка својства и методе. Ово су у суштини референтне библиотеке које се користе без креирања објеката. Можете се позвати на статичку класу кроз литерал тако што ћете назив типа ставити у угласте заграде. Међутим, ако погледамо структуру објекта користећи Гет-Мембер, видећемо тип Систем.РунтимеТипе уместо Систем.Енвиронмент:

[System.Environment] | Get-Member

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Да бисте видели само статичне чланове, позовите Гет-Мембер са параметром -Статиц (обратите пажњу на тип објекта):

[System.Environment] | Get-Member -Static

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Да бисте приступили статичким својствима и методама, користите две узастопне двотачке уместо тачке после литерала:

[System.Environment]::OSVersion

Ор

$test=[System.Math]::Sqrt(25) 
$test
$test.GetType()

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Откуцајте ПСЦустомОбјецт

Међу бројним типовима података доступним у ПоверСхелл-у, вреди поменути ПСЦустомОбјецт, дизајниран за складиштење објеката произвољне структуре. Креирање таквог објекта помоћу команде Нев-Објецт се сматра класичним, али гломазним и застарелим начином:

$object = New-Object  –TypeName PSCustomObject -Property @{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'}

Погледајмо структуру објекта:

$object | Get-Member

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Почевши од ПоверСхелл-а 3.0, доступна је још једна синтакса:

$object = [PSCustomObject]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

Подацима можете приступити на један од еквивалентних начина:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Ево примера претварања постојеће хеш табеле у објекат:

$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Један од недостатака објеката овог типа је то што се редослед њихових својстава може мењати. Да бисте то избегли, морате користити атрибут [ордеред]:

$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

Постоје и друге опције за креирање објекта: горе смо погледали коришћење цмдлета Селецт-Објецт. Остаје само да схватите додавање и уклањање елемената. Урадити ово за објекат из претходног примера је прилично једноставно:

$object | Add-Member –MemberType NoteProperty –Name Age  –Value 33
$object | Get-Member

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Адд-Мембер цмдлет вам омогућава да додате не само својства, већ и методе претходно креираном $објекту користећи конструкцију „-МемберТипе СцриптМетход“:

$ScriptBlock = {
    # код 
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member

Имајте на уму да смо користили променљиву $СцриптБлоцк типа СцриптБлоцк за чување кода за нови метод.

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Да бисте уклонили својства, користите одговарајући метод:

$object.psobject.properties.remove('Name')

Креирање сопствених часова

ПоверСхелл 5.0 увео је могућност дефинисања класе користећи синтаксу карактеристичну за објектно оријентисане програмске језике. За то је намењена сервисна реч Цласс, после које треба да наведете име класе и опишете њено тело у операторским заградама:

class MyClass
{
    # тело класса
}

Ово је прави .НЕТ Цоре тип, са телом које описује његова својства, методе и друге елементе. Погледајмо пример дефинисања најједноставније класе:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
}

Да бисте креирали објекат (инстанцу класе), користите цмдлет Нев-Објецт, или литерал типа [МиЦласс] и псеудостатска метода ново (подразумевани конструктор):

$object = New-Object -TypeName MyClass

или

$object = [MyClass]::new()

Хајде да анализирамо структуру објекта:

$object | Get-Member

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Не заборавите на опсег: не можете се позивати на име типа као стринг или користити литерал типа изван скрипте или модула у којем је класа дефинисана. У овом случају, функције могу да врате инстанце (објекте) класе које ће бити доступне изван модула или скрипте.

Након креирања објекта, попуните његова својства:

$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Имајте на уму да опис класе наводи не само типове својстава, већ и њихове подразумеване вредности:

class Example
{
     [string]$Name = 'John Doe'
}

Опис методе класе личи на опис функције, али без употребе речи функције. Као иу функцији, параметри се прослеђују методама ако је потребно:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
     
     #описание метода
     Smile([bool]$param1)
     {
         If($param1) {
            Write-Host ':)'
         }
     }
}

Сада представник наше класе може да се осмехне:

$object = [MyClass]::new()
$object.Smile($true)

Методе могу бити преоптерећене; поред тога, класа има статичка својства и методе, као и конструктори чија се имена поклапају са именом саме класе. Класа дефинисана у скрипти или ПоверСхелл модулу може послужити као основа за другу - овако се спроводи наслеђивање. У овом случају, дозвољено је користити постојеће .НЕТ класе као основне:

class MyClass2 : MyClass
{
      #тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)

Наш опис рада са објектима у ПоверСхелл-у тешко да је исцрпан. У следећим публикацијама покушаћемо да га продубимо практичним примерима: пети чланак у низу биће посвећен питањима интеграције ПоверСхелл-а са софтверским компонентама треће стране. Прошли делови се могу наћи на линковима испод.

Део 1: Основне функције Виндовс ПоверСхелл-а
Део 2: Увод у програмски језик Виндовс ПоверСхелл
Део 3: прослеђивање параметара скриптама и функцијама, креирање цмдлет-а

Шта је Виндовс ПоверСхелл и за шта се користи? Део 4: Рад са објектима, сопствене класе

Извор: ввв.хабр.цом

Додај коментар