Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

PowerShell котормочу терезесиндеги буйруктардын тексттик чыгышы маалыматты адамдын кабылдоосуна ылайыктуу формада көрсөтүүнүн бир жолу. Негизи шаршемби багытталган объекттер менен иштөө үчүн: cmdlets жана функциялар аларды киргизүү жана катары кабыл алат чыгууда кайтып келди, жана интерактивдүү жана скрипттерде жеткиликтүү болгон өзгөрмөлөрдүн түрлөрү .NET класстарына негизделген. Сериянын төртүнчү макаласында биз объекттер менен иштөөнү кененирээк изилдейбиз.

Мазмуну:

PowerShell ичиндеги объекттер
Объекттердин структурасын көрүү
Объекттерди чыпкалоо
Объекттерди сорттоо
Объекттерди жана алардын бөлүктөрүн тандоо
ForEach-Object, Group-Object жана Measure-Object
.NET жана COM объекттерин түзүү (New-Object)
Статикалык ыкмаларды чакыруу
PSCustomObject териңиз
Өзүңүздүн класстарыңызды түзүү

PowerShell ичиндеги объекттер

Эске салсак, объект бул маалымат талааларынын (касиеттери, окуялары ж.б.) жана аларды иштетүү ыкмаларынын (методдор) жыйындысы. Анын түзүмү түрү боюнча көрсөтүлөт, ал адатта бирдиктүү .NET Core платформасында колдонулган класстарга негизделген. Ошондой эле COM, CIM (WMI) жана ADSI объекттери менен иштөөгө болот. Берилиштер боюнча ар кандай аракеттерди аткаруу үчүн касиеттер жана ыкмалар керек; Мындан тышкары, PowerShellде объекттер функцияларга жана командлеттерге аргумент катары берилиши мүмкүн, алардын баалуулуктары өзгөрмөлөргө ыйгарылган, ошондой эле бар. команда түзүү механизми (конвейер же трубопровод). Контурдагы ар бир буйрук объект боюнча өз жыйынтыгын кийинкиге өткөрүп берет. Иштетүү үчүн сиз компиляцияланган комдлеттерди колдонсоңуз же өзүңүздүнүңүздү түзө аласыз өркүндөтүлгөн өзгөчөлүктөркуурдагы объектилер менен ар кандай манипуляцияларды жасоо: чыпкалоо, сорттоо, топтоо, ал тургай алардын түзүлүшүн өзгөртүү. Берилиштерди бул формада берүү олуттуу артыкчылыкка ээ: кабыл алуучу командага байт агымын (текстти) талдоонун кереги жок, бардык керектүү маалыматтар тиешелүү касиеттерди жана ыкмаларды чакыруу менен оңой алынат.

Объекттердин структурасын көрүү

Мисалы, Get-Process командлетин иштетели, ал системада иштеп жаткан процесстер жөнүндө маалымат алууга мүмкүндүк берет:

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Ал кайтарылган объекттердин касиеттери жана алардын ыкмалары жөнүндө эч кандай түшүнүк бербеген кээ бир форматталган текст маалыматтарын көрсөтөт. Чыгарууну тактоо үчүн биз объекттердин структурасын изилдөөнү үйрөнүшүбүз керек жана Get-Müşe cmdlet бул жагынан бизге жардам берет:

Get-Process | Get-Member

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Бул жерде биз түрүн жана структурасын көрүп жатабыз жана кошумча параметрлердин жардамы менен, мисалы, киргизүүгө киргизилген объекттин гана касиеттерин көрсөтө алабыз:

Get-Process | Get-Member -MemberType Property

Бул билим башкаруу маселелерин интерактивдүү чечүү үчүн же өзүңүздүн скриптиңизди жазуу үчүн керек болот: мисалы, Responding касиетин колдонуу менен илинген процесстер жөнүндө маалымат алуу.

Объекттерди чыпкалоо

PowerShell белгилүү бир шартка жооп берген объекттерди түтүк аркылуу өткөрүүгө мүмкүндүк берет:

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

Кашанын ичиндеги скрипт блогун аткаруунун натыйжасы логикалык маани болушу керек. Эгер ал чын болсо ($true), Кайда-Объект комдлетине киргизилген объект конвейер боюнча өткөрүлөт, антпесе ($false) жок кылынат. Мисалы, токтоп калган Windows Server кызматтарынын тизмесин көрсөтөлү, б.а. Status касиети "Токтоду" деп коюлгандар:

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

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Бул жерде дагы бир тексттик сүрөттөлүштү көрөбүз, бирок сиз түтүк аркылуу өткөн объекттердин түрүн жана ички түзүлүшүн түшүнгүңүз келсе, бул кыйын эмес:

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

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Объекттерди сорттоо

Объекттерди түтүк жолу менен иштетүүдө көп учурда аларды сорттоо зарылчылыгы келип чыгат. Sort-Object командлетине касиеттердин аттары (сорттоочу ачкычтар) берилет жана объекттерди алардын маанилери боюнча иреттелген кайтарат. Иштеп жаткан процесстердин жыйынтыгын CPU убактысына жараша сорттоо оңой (cpu касиети):

Get-Process | Sort-Object –Property cpu

Sort-Object командлетин чакырганда -Property параметрин өткөрүп жиберүүгө болот; ал демейки боюнча колдонулат. Тескери сорттоо үчүн -Төмөндөө параметрин колдонуңуз:

Get-Process | Sort-Object cpu -Descending

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Объекттерди жана алардын бөлүктөрүн тандоо

Select-Object командлети -Биринчи же -Акыркы параметрлерди колдонуу менен түтүктүн башында же аягында объекттердин белгилүү санын тандоого мүмкүндүк берет. Анын жардамы менен сиз жалгыз объекттерди же белгилүү касиеттерди тандап, ошондой эле алардын негизинде жаңы объекттерди түзө аласыз. Келгиле, жөнөкөй мисалдарды колдонуу менен cmdlet кантип иштээрин карап көрөлү.

Төмөнкү команда RAMдын максималдуу көлөмүн (WS касиети) керектөөчү 10 процесс жөнүндө маалыматты көрсөтөт:

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

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Сиз түтүк аркылуу өткөн объекттердин айрым гана касиеттерин тандап, алардын негизинде жаңыларын түзө аласыз:

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

Түтүктүн иштешинин натыйжасында биз жаңы объектти алабыз, анын түзүмү Get-Process командлети кайтарган структурадан айырмаланат. Келиңиз, муну Get-мүчөсү аркылуу текшерели:

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

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Select-Object биз көрсөткөн эки талааны гана камтыган бир объектти (-Биринчи 1) кайтарарын эске алыңыз: алардын маанилери Get-Process комдлети аркылуу түтүккө өткөн биринчи объекттен көчүрүлдү. PowerShell скрипттеринде объекттерди түзүүнүн жолдорунун бири Select-Object колдонууга негизделген:

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

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Select-Object колдонуп, сиз катары көрсөтүлүшү керек болгон объекттерге эсептелген касиеттерди кошо аласыз хэш таблицалар. Бул учурда, анын биринчи ачкычынын мааниси менчиктин аталышына, ал эми экинчи ачкычтын мааниси учурдагы түтүк элементинин касиетинин маанисине туура келет:

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

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Конвейер аркылуу өтүүчү объектилердин түзүлүшүн карап көрөлү:

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

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

ForEach-Object, Group-Object жана Measure-Object

Объекттер менен иштөө үчүн башка комдлеттер бар. Мисал катары, эң пайдалуу үчөө жөнүндө сүйлөшөлү:

ForEach-Object түтүктөгү ар бир объект үчүн PowerShell кодун иштетүүгө мүмкүндүк берет:

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

Топ-объект объекттерди менчик наркы боюнча топтор:

Group-Object PropertyName

Эгер сиз аны -NoElement параметри менен иштетсеңиз, топтордогу элементтердин санын биле аласыз.

Өлчөм-объект түтүктөгү объект талаасынын маанилери боюнча ар кандай жыйынтыктоочу параметрлерди бириктирет (сумманы эсептейт, ошондой эле минималдуу, максималдуу же орточо маанини табат):

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

Эреже катары, талкууланган cmdlets интерактивдүү колдонулат жана көбүнчө сценарийлерде түзүлөт. милдеттери Begin, Process жана End блоктору менен.

.NET жана COM объекттерин түзүү (New-Object)

Системалык администраторлор үчүн пайдалуу болгон .NET Core жана COM интерфейстери бар көптөгөн программалык камсыздоо компоненттери бар. System.Diagnostics.EventLog классын колдонуу менен сиз система журналдарын түздөн-түз Windows PowerShellден башкара аласыз. Келгиле, -TypeName параметри менен New-Object командлетинин жардамы менен бул класстын үлгүсүн түзүүнүн мисалын карап көрөлү:

New-Object -TypeName System.Diagnostics.EventLog

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Биз конкреттүү окуялар журналын көрсөтпөгөндүктөн, класстын жыйынтыгында эч кандай маалымат жок. Муну өзгөртүү үчүн -ArgumentList параметрин колдонуу менен аны түзүү учурунда атайын конструктор ыкмасын чакырышыңыз керек. Эгерде биз тиркеме журналына кирүүнү кааласак, конструкторго аргумент катары "Колдонмо" сабын беришибиз керек:

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

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Биз буйруктун жыйынтыгын $AppLog өзгөрмөсүндө сактаганыбызды эске алыңыз. Түтүк өткөргүчтөр көбүнчө интерактивдүү режимде колдонулса да, скрипттерди жазуу көбүнчө объектке шилтемени сактоону талап кылат. Кошумча, негизги .NET Core класстары Системанын аттар мейкиндигинде камтылган: PowerShell демейки боюнча андагы көрсөтүлгөн типтерди издейт, андыктан System.Diagnostics.EventLog ордуна Diagnostics.EventLog жазуу абдан туура.

журналы менен иштөө үчүн, сиз тиешелүү ыкмаларды колдоно аласыз:

$AppLog | Get-Member -MemberType Method

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Кирүү укуктары бар болсо, ал Clear() ыкмасы менен тазаланды дейли:

$AppLog.Clear()

New-Object командлети COM компоненттери менен иштөө үчүн да колдонулат. Алардын саны абдан көп - Windows скрипт сервери менен камсыздалган китепканалардан баштап, Internet Explorer сыяктуу ActiveX тиркемелерине чейин. COM объектисин түзүү үчүн, сиз каалаган класстын программалык ProgId менен -ComObject параметрин коюшуңуз керек:

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

Өзүңүздүн объектилериңизди ыктыярдуу түзүм менен түзүү үчүн, New-Object колдонуу өтө архаикалык жана түйшүктүү көрүнөт; бул командлет PowerShell'ден тышкары программалык камсыздоо компоненттери менен иштөө үчүн колдонулат. Кийинки макалаларда бул маселе кененирээк талкууланат. .NET жана COM объекттеринен тышкары, биз CIM (WMI) жана ADSI объекттерин дагы изилдейбиз.

Статикалык ыкмаларды чакыруу

Кээ бир .NET Core класстары, анын ичинде System.Environment жана System.Math. Алар статикалык жана статикалык касиеттерин жана ыкмаларын гана камтыйт. Бул объекттерди түзбөстөн колдонулган шилтеме китепканалар. Типтин атын төрт бурчтуу кашаага алуу менен статикалык класска литерал аркылуу кайрылсаңыз болот. Бирок, Get-Member аркылуу объекттин структурасын карасак, System.Environment ордуна System.RuntimeType түрүн көрөбүз:

[System.Environment] | Get-Member

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Статикалык мүчөлөрдү гана көрүү үчүн Get-Member дегенге -Static параметри менен чалыңыз (объекттин түрүнө көңүл буруңуз):

[System.Environment] | Get-Member -Static

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Статикалык касиеттерге жана методдорго жетүү үчүн сөзмө-сөздөн кийинки чекиттин ордуна эки катарлаш кош чекиттерди колдонуңуз:

[System.Environment]::OSVersion

же

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

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

PSCustomObject териңиз

PowerShellде жеткиликтүү болгон көп сандаган маалымат түрлөрүнүн ичинен PSCustomObjectти белгилей кетүү керек, ыктыярдуу түзүлүш менен объекттерди сактоо үчүн иштелип чыккан. New-Object командлетинин жардамы менен мындай объектти түзүү классикалык, бирок түйшүктүү жана эскирген ыкма болуп эсептелет:

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

Объекттин түзүлүшүн карап көрөлү:

$object | Get-Member

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

PowerShell 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()

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Бул типтеги объекттердин кемчиликтеринин бири алардын касиеттеринин тартиби өзгөрүшү мүмкүн. Мунун алдын алуу үчүн, сиз [ordered] атрибутун колдонушуңуз керек:

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

Объектти түзүүнүн башка варианттары бар: жогоруда биз cmdlet колдонууну карадык Танда-Object. Калган нерсе элементтерди кошуу жана алып салуу. Мурунку мисалдагы объект үчүн муну жасоо абдан жөнөкөй:

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

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Add-Müşe командлети "-MemberType ScriptMethod" конструкциясын колдонуу менен мурда түзүлгөн $объектке касиеттерди гана эмес, методдорду да кошууга мүмкүндүк берет:

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

Жаңы ыкманын кодун сактоо үчүн ScriptBlock түрүндөгү $ScriptBlock өзгөрмөсүн колдонгонубузду эске алыңыз.

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

касиеттерин алып салуу үчүн, тиешелүү ыкманы колдонушат:

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

Өзүңүздүн класстарыңызды түзүү

PowerShell 5.0 аныктоо мүмкүнчүлүгүн киргизди класстар объектиге багытталган программалоо тилдеринин синтаксистик өзгөчөлүктөрүн колдонуу. Класс кызматтык сөзү бул үчүн арналган, андан кийин класстын атын көрсөтүү жана оператордук кашаанын ичинде анын корпусун сүрөттөп берүү керек:

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

Бул чыныгы .NET Core түрү, анын касиеттерин, ыкмаларын жана башка элементтерин сүрөттөгөн денеси бар. Эң жөнөкөй классты аныктоонун мисалын карап көрөлү:

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

Объектти (класстын инстанциясын) түзүү үчүн, cmdlet колдонуңуз New-Object, же [MyClass] түрүндөгү литерал жана псевдостатикалык ыкма жаңы (демейки конструктор):

$object = New-Object -TypeName MyClass

же

$object = [MyClass]::new()

Объекттин түзүлүшүн талдап көрөлү:

$object | Get-Member

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Колдонуу чөйрөсү жөнүндө унутпаңыз: типтин аталышын сап катары атай албайсыз же класс аныкталган скрипттен же модулдан тышкары типтин литералын колдоно албайсыз. Бул учурда, функциялар модулдан же скрипттен тышкары жеткиликтүү боло турган класс инстанцияларын (объекттерди) кайтара алат.

Объектти түзгөндөн кийин анын касиеттерин толтуруңуз:

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

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 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)

Методдор ашыкча жүктөлүшү мүмкүн; Мындан тышкары, класс бар статикалык касиеттери жана ыкмалары, ошондой эле аттары класстын аталышы менен дал келген конструкторлор. Скриптте же PowerShell модулунда аныкталган класс башкасы үчүн негиз катары кызмат кыла алат - мурас ушундайча ишке ашат. Бул учурда, базалык класстар катары учурдагы .NET класстарын колдонууга уруксат берилет:

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

PowerShellдеги объектилер менен иштөө сүрөттөлүшүбүз толук эмес. Кийинки басылмаларда биз аны практикалык мисалдар менен тереңдетүүгө аракет кылабыз: сериядагы бешинчи макала PowerShell программасын үчүнчү тараптын программалык камсыздоо компоненттери менен интеграциялоо маселелерине арналат. Өткөн бөлүктөрдү төмөнкү шилтемелерден тапса болот.

1-бөлүк: Негизги Windows PowerShell өзгөчөлүктөрү
2-бөлүк: Windows PowerShell программалоо тилине киришүү
3-бөлүк: скрипттерге жана функцияларга параметрлерди өткөрүү, комдлеттерди түзүү

Windows PowerShell деген эмне жана ал эмне үчүн колдонулат? 4-бөлүк: Объекттер менен иштөө, өздүк класстар

Source: www.habr.com

Комментарий кошуу