Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Komandų tekstinė išvestis PowerShell interpretatoriaus lange yra tik būdas parodyti informaciją žmogaus suvokimui tinkama forma. Tiesą sakant, trečiadienį orientuotas dirbti su objektais: cmdlet ir funkcijos juos gauna kaip įvestį ir grįžo prie išėjimo, o interaktyviai ir scenarijuose pasiekiami kintamųjų tipai yra pagrįsti .NET klasėmis. Ketvirtajame serijos straipsnyje mes išsamiau išnagrinėsime darbą su objektais.

Turinys:

Objektai PowerShell
Objektų struktūros peržiūra
Objektų filtravimas
Objektų rūšiavimas
Objektų ir jų dalių pasirinkimas
Kiekvienam objektui, grupei objektui ir priemonei objektui
NET ir COM objektų kūrimas (New-Object)
Statinių metodų iškvietimas
Įveskite PSCustomObject
Kurti savo klases

Objektai PowerShell

Prisiminkime, kad objektas yra duomenų laukų (ypatybių, įvykių ir kt.) ir jų apdorojimo metodų (metodų) rinkinys. Jos struktūrą nurodo tipas, kuris dažniausiai grindžiamas klasėmis, naudojamomis vieningoje .NET Core platformoje. Taip pat galima dirbti su COM, CIM (WMI) ir ADSI objektais. Ypatybės ir metodai reikalingi norint atlikti įvairius veiksmus su duomenimis; be to, PowerShell, objektai gali būti perduodami kaip argumentai funkcijoms ir cmdlet, priskirtos jų reikšmės kintamiesiems, taip pat yra komandų sudarymo mechanizmas (konvejeris arba vamzdynas). Kiekviena konvejerio komanda savo išvestį perduoda kitai komandai, objektas po objekto. Apdorojimui galite naudoti sukompiliuotas cmdlet arba sukurti savo pažangios funkcijosatlikti įvairias manipuliacijas su vamzdyne esančiais objektais: filtruoti, rūšiuoti, grupuoti ir net keisti jų struktūrą. Duomenų perdavimas tokia forma turi rimtą privalumą: priimančiai komandai nereikia analizuoti baitų srauto (teksto), visa reikalinga informacija lengvai išgaunama iškvietus atitinkamas savybes ir metodus.

Objektų struktūros peržiūra

Pavyzdžiui, paleiskite Get-Process cmdlet, kuri leidžia gauti informacijos apie sistemoje veikiančius procesus:

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Bus rodomi kai kurie suformatuoti tekstiniai duomenys, kurie nesuteikia jokio supratimo apie grąžinamų objektų savybes ir jų metodus. Norėdami tiksliai sureguliuoti išvestį, turime išmokti ištirti objektų struktūrą, o cmdlet Get-Member padės mums tai padaryti:

Get-Process | Get-Member

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Čia jau matome tipą ir struktūrą, o papildomų parametrų pagalba galime, pavyzdžiui, rodyti tik į įvestį įtraukto objekto savybes:

Get-Process | Get-Member -MemberType Property

Šių žinių prireiks norint interaktyviai spręsti administravimo problemas arba rašyti savo scenarijus: pavyzdžiui, norint gauti informacijos apie pakabintus procesus naudojant savybę Responding.

Objektų filtravimas

„PowerShell“ leidžia tam tikrą sąlygą atitinkančius objektus perduoti vamzdynu:

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

Scenarijaus bloko skliausteliuose vykdymo rezultatas turi būti loginė reikšmė. Jei teisinga ($true), objektas, įvestas į cmdlet Kur-Object, bus perduotas konvejeriu, priešingu atveju ($false) jis bus ištrintas. Pavyzdžiui, parodykime sustabdytų Windows Server paslaugų sąrašą, t.y. tie, kurių būsenos ypatybė nustatyta į „Sustabdyta“:

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

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Čia vėl matome tekstinį vaizdą, bet jei norite suprasti objektų, einančių per dujotiekį, tipą ir vidinę struktūrą, tai nėra sunku:

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

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Objektų rūšiavimas

Apdorojant objektus vamzdynu, dažnai reikia juos rūšiuoti. „Sort-Object“ cmdlet perduodami ypatybių pavadinimai (rūšiavimo raktai) ir pateikiami objektai, išdėstyti pagal jų reikšmes. Nesunku rūšiuoti vykdomų procesų išvestį pagal praleistą procesoriaus laiką (procesoriaus savybę):

Get-Process | Sort-Object –Property cpu

Parametras -Property gali būti praleistas iškviečiant cmdlet Sort-Object; jis naudojamas pagal numatytuosius nustatymus. Jei norite rūšiuoti atvirkštiniu būdu, naudokite parametrą -Descending:

Get-Process | Sort-Object cpu -Descending

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Objektų ir jų dalių pasirinkimas

„Select-Object“ cmdlet leidžia pasirinkti tam tikrą objektų skaičių konvejerio pradžioje arba pabaigoje naudojant parametrus -First arba -Last. Su jo pagalba galite pasirinkti pavienius objektus ar tam tikras savybes, taip pat pagal juos kurti naujus objektus. Pažiūrėkime, kaip veikia cmdlet, naudodami paprastus pavyzdžius.

Ši komanda rodo informaciją apie 10 procesų, sunaudojančių didžiausią RAM kiekį (WS savybė):

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

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Galite pasirinkti tik tam tikras konvejeriu einančių objektų ypatybes ir pagal jas kurti naujas:

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

Dėl dujotiekio veikimo gausime naują objektą, kurio struktūra skirsis nuo Get-Process cmdlet grąžintos struktūros. Patikrinkite tai naudodami Get-Member:

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

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Atminkite, kad „Select-Object“ grąžina vieną objektą (-First 1), kuriame yra tik du mūsų nurodyti laukai: jų reikšmės buvo nukopijuotos iš pirmojo objekto, kurį į konvejerį perdavė Get-Process cmdlet. Vienas iš būdų, kaip sukurti objektus PowerShell scenarijuose, yra pagrįstas pasirinkimo objekto naudojimu:

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

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Naudodami „Select-Object“ galite pridėti apskaičiuotas ypatybes prie objektų, kurie turi būti pavaizduoti kaip maišos lentelės. Šiuo atveju jo pirmojo rakto reikšmė atitinka ypatybės pavadinimą, o antrojo rakto vertė atitinka dabartinio dujotiekio elemento ypatybės vertę:

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

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Pažvelkime į objektų, einančių per konvejerį, struktūrą:

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

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Kiekvienam objektui, grupei objektui ir priemonei objektui

Yra ir kitų cmdlet, skirtų darbui su objektais. Pavyzdžiui, pakalbėkime apie tris naudingiausius:

„ForEach-Object“ leidžia paleisti „PowerShell“ kodą kiekvienam dujotiekio objektui:

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

Grupė-objektas sugrupuoja objektus pagal nuosavybės vertę:

Group-Object PropertyName

Jei paleisite jį naudodami parametrą -NoElement, galite sužinoti elementų skaičių grupėse.

Matas-Objektas apibendrina įvairius apibendrintus parametrus pagal objekto lauko reikšmes konvejeryje (apskaičiuoja sumą, taip pat suranda mažiausią, didžiausią ar vidutinę reikšmę):

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

Paprastai aptariamos cmdlet naudojamos interaktyviai ir dažnai kuriamos scenarijuose. функции su pradžios, proceso ir pabaigos blokais.

NET ir COM objektų kūrimas (New-Object)

Yra daug programinės įrangos komponentų su .NET Core ir COM sąsajomis, kurios yra naudingos sistemos administratoriams. Naudodami System.Diagnostics.EventLog klasę galite tvarkyti sistemos žurnalus tiesiai iš Windows PowerShell. Pažvelkime į šios klasės egzemplioriaus kūrimo pavyzdį naudojant cmdlet New-Object su parametru -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Kadangi nenurodėme konkretaus įvykių žurnalo, gautame klasės egzemplioriuje nėra duomenų. Norėdami tai pakeisti, jo kūrimo metu turite iškviesti specialų konstruktoriaus metodą naudodami parametrą -ArgumentList. Jei norime pasiekti programos žurnalą, kaip argumentą konstruktoriui turėtume perduoti eilutę „Application“:

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

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Atkreipkite dėmesį, kad komandos išvestį išsaugojome $AppLog kintamajame. Nors vamzdynai dažniausiai naudojami interaktyviuoju režimu, rašant scenarijus dažnai reikia išlaikyti nuorodą į objektą. Be to, pagrindinės .NET Core klasės yra sistemos vardų erdvėje: PowerShell pagal numatytuosius nustatymus joje ieško nurodytų tipų, todėl rašyti Diagnostics.EventLog vietoj System.Diagnostics.EventLog yra gana teisinga.

Norėdami dirbti su žurnalu, galite naudoti atitinkamus metodus:

$AppLog | Get-Member -MemberType Method

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Tarkime, kad jis išvalomas naudojant Clear() metodą, jei yra prieigos teisės:

$AppLog.Clear()

„New-Object“ cmdlet taip pat naudojama darbui su COM komponentais. Jų yra gana daug – nuo ​​bibliotekų, tiekiamų su „Windows“ scenarijų serveriu, iki „ActiveX“ programų, tokių kaip „Internet Explorer“. Norėdami sukurti COM objektą, turite nustatyti parametrą -ComObject su norimos klasės programiniu ProgId:

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

Norėdami sukurti savo objektus su savavališka struktūra, naudoti New-Object atrodo pernelyg archajiška ir sudėtinga; ši cmdlet naudojama dirbti su programinės įrangos komponentais, nepriklausančiais PowerShell. Kituose straipsniuose šis klausimas bus aptartas išsamiau. Be .NET ir COM objektų, mes taip pat tyrinėsime CIM (WMI) ir ADSI objektus.

Statinių metodų iškvietimas

Kai kurių .NET Core klasių neįmanoma sukurti, įskaitant System.Environment ir System.Math. Jie yra statinis ir turi tik statines savybes ir metodus. Iš esmės tai yra nuorodų bibliotekos, kurios naudojamos nesukuriant objektų. Į statinę klasę galite kreiptis pažodžiu, laužtiniuose skliaustuose įtraukdami tipo pavadinimą. Tačiau jei pažvelgsime į objekto struktūrą naudodami Get-Member, vietoje System.Environment pamatysime tipą System.RuntimeType:

[System.Environment] | Get-Member

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Norėdami peržiūrėti tik statinius narius, skambinkite Get-Member naudodami parametrą -Static (atkreipkite dėmesį į objekto tipą):

[System.Environment] | Get-Member -Static

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Norėdami pasiekti statines ypatybes ir metodus, vietoj taško po raidės naudokite du dvitaškius iš eilės:

[System.Environment]::OSVersion

Or

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

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Įveskite PSCustomObject

Tarp daugelio PowerShell galimų duomenų tipų verta paminėti PSCustomObject, skirtą savavališkos struktūros objektams saugoti. Tokio objekto kūrimas naudojant cmdlet „New-Object“ laikomas klasikiniu, bet sudėtingu ir pasenusiu būdu:

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

Pažvelkime į objekto struktūrą:

$object | Get-Member

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Pradedant nuo PowerShell 3.0, galima kita sintaksė:

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

Duomenis galite pasiekti vienu iš lygiaverčių būdų:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Štai pavyzdys, kaip konvertuoti esamą maišos lentelę į objektą:

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

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Vienas iš šio tipo objektų trūkumų – gali keistis jų savybių tvarka. Norėdami to išvengti, turite naudoti atributą [ordered]:

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

Yra ir kitų objekto kūrimo parinkčių: aukščiau pažvelgėme į cmdlet naudojimą Pasirinkite-objektas. Lieka tik išsiaiškinti, kaip pridėti ir pašalinti elementus. Tai padaryti su objektu iš ankstesnio pavyzdžio yra gana paprasta:

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

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

„Add-Member“ cmdlet leidžia pridėti ne tik ypatybes, bet ir metodus prie anksčiau sukurto $objekto naudojant „-MemberType ScriptMethod“ konstrukciją:

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

Atkreipkite dėmesį, kad naujojo metodo kodui išsaugoti naudojome $ScriptBlock kintamąjį, kurio tipas yra ScriptBlock.

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Norėdami pašalinti savybes, naudokite atitinkamą metodą:

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

Kurti savo klases

PowerShell 5.0 pristatė galimybę apibrėžti klasės naudojant objektinio programavimo kalboms būdingą sintaksę. Tam skirtas paslaugų žodis Class, po kurio turėtumėte nurodyti klasės pavadinimą ir apibūdinti jos korpusą operatoriaus skliausteliuose:

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

Tai tikras .NET Core tipas, kurio turinys aprašo jo savybes, metodus ir kitus elementus. Pažvelkime į paprasčiausios klasės apibrėžimo pavyzdį:

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

Norėdami sukurti objektą (klasės egzempliorių), naudokite cmdlet Naujas objektas, arba [MyClass] tipo pažodinis ir pseudostatinis metodas naujas (numatytasis konstruktorius):

$object = New-Object -TypeName MyClass

arba

$object = [MyClass]::new()

Išanalizuokime objekto struktūrą:

$object | Get-Member

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Nepamirškite apie taikymo sritį: negalite nurodyti tipo pavadinimo kaip eilutės arba naudoti tipo literatūrą už scenarijaus ar modulio, kuriame yra apibrėžta klasė. Šiuo atveju funkcijos gali grąžinti klasių egzempliorius (objektus), kurie bus pasiekiami už modulio ar scenarijaus ribų.

Sukūrę objektą, užpildykite jo savybes:

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

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Atminkite, kad klasės aprašyme nurodomi ne tik ypatybių tipai, bet ir numatytosios jų reikšmės:

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

Klasės metodo aprašymas primena funkcijos aprašymą, tačiau nenaudojamas funkcijos žodis. Kaip ir funkcijoje, prireikus parametrai perduodami metodams:

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

Dabar mūsų klasės atstovė gali šypsotis:

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

Metodai gali būti perkrauti, be to, klasė turi statinės savybės ir metodai, taip pat konstruktoriai, kurių pavadinimai sutampa su pačios klasės pavadinimu. Scenarijuje ar PowerShell modulyje apibrėžta klasė gali pasitarnauti kaip kitos bazės – taip įgyvendinamas paveldėjimas. Šiuo atveju leidžiama naudoti esamas .NET klases kaip bazines:

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

Mūsų darbo su objektais PowerShell aprašymas nėra išsamus. Tolesniuose leidiniuose bandysime tai pagilinti praktiniais pavyzdžiais: penktasis serijos straipsnis bus skirtas PowerShell integravimo su trečiųjų šalių programinės įrangos komponentais problemoms. Ankstesnes dalis galite rasti žemiau esančiose nuorodose.

1 dalis: Pagrindinės „Windows PowerShell“ funkcijos
2 dalis: „Windows PowerShell“ programavimo kalbos įvadas
3 dalis: parametrų perdavimas scenarijams ir funkcijoms, cmdlet kūrimas

Kas yra Windows PowerShell ir kam ji naudojama? 4 dalis: Darbas su objektais, savos klasės

Šaltinis: www.habr.com

Добавить комментарий