Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

PowerShelli interpretaatori akna käskude tekstiväljund on lihtsalt viis teabe kuvamiseks inimese tajumiseks sobival kujul. Tegelikult kolmapäeval orienteeritud objektidega töötamiseks: cmdletid ja funktsioonid võtavad need vastu sisendina ja tagasi väljapääsu juures, ning interaktiivselt ja skriptides saadaolevad muutujatüübid põhinevad .NET-klassidel. Sarja neljandas artiklis uurime lähemalt tööd objektidega.

Оглавление

Objektid PowerShellis
Objektide struktuuri vaatamine
Objektide filtreerimine
Objektide sorteerimine
Objektide ja nende osade valimine
Iga objekti jaoks, rühma objektiks ja mõõtmiseks objektiks
.NET- ja COM-objektide loomine (New-Object)
Staatiliste meetodite kutsumine
Tippige PSCustomObject
Oma klasside loomine

Objektid PowerShellis

Tuletagem meelde, et objekt on andmeväljade (omadused, sündmused jne) ja nende töötlemise meetodite (meetodite) kogum. Selle struktuuri määrab tüüp, mis põhineb tavaliselt ühtses .NET Core platvormis kasutatavatel klassidel. Samuti on võimalik töötada COM, CIM (WMI) ja ADSI objektidega. Atribuudid ja meetodid on vajalikud andmetega erinevate toimingute tegemiseks, lisaks saab PowerShellis objekte edastada argumentidena funktsioonidele ja cmdlet-käskudele, määrata nende väärtused muutujatele ning on olemas ka käskude koostamise mehhanism (konveier või torujuhe). Iga konveieri käsk edastab oma väljundi objekti haaval omakorda järgmisele. Töötlemiseks võite kasutada koostatud cmdlet-faile või luua oma täiustatud funktsioonidteha erinevaid manipuleerimisi torus olevate objektidega: filtreerida, sorteerida, rühmitada ja isegi muuta nende struktuuri. Andmete sellisel kujul edastamisel on tõsine eelis: vastuvõttev meeskond ei pea baidivoogu (teksti) sõeluma, kogu vajalik teave on hõlpsasti leitav, kutsudes välja vastavad omadused ja meetodid.

Objektide struktuuri vaatamine

Näiteks käivitame Get-Process cmdlet-i, mis võimaldab hankida teavet süsteemis töötavate protsesside kohta:

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

See kuvab mõningaid vormindatud tekstiandmeid, mis ei anna mingit ettekujutust tagastatud objektide omadustest ja nende meetoditest. Väljundi täpsustamiseks peame õppima objektide struktuuri uurima ja Get-Member cmdlet aitab meid selles:

Get-Process | Get-Member

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Siin näeme juba tüüpi ja struktuuri ning lisaparameetrite abil saame näiteks kuvada ainult sisendis sisalduva objekti omadusi:

Get-Process | Get-Member -MemberType Property

Neid teadmisi on vaja haldusprobleemide interaktiivseks lahendamiseks või oma skriptide kirjutamiseks: näiteks selleks, et saada teavet rippuvate protsesside kohta, kasutades atribuuti Responding.

Objektide filtreerimine

PowerShell võimaldab teatud tingimustele vastavaid objekte torujuhtme kaudu juhtida:

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

Sulgudes oleva skriptiploki täitmise tulemus peab olema tõeväärtus. Kui see on tõene ($true), edastatakse cmdlet-käsku Kus-Object sisestatud objekt piki konveieri, vastasel juhul ($false) see kustutatakse. Näitame näiteks peatatud Windows Serveri teenuste loendit, st. need, kelle staatuse atribuudiks on seatud "Peatatud":

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

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Siin näeme jällegi tekstilist esitust, kuid kui soovite mõista torujuhet läbivate objektide tüüpi ja sisemist struktuuri, pole see keeruline:

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

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Objektide sorteerimine

Objektide torujuhtme töötlemisel tekib sageli vajadus neid sorteerida. Käsk Sort-Object edastab atribuutide nimed (sorteerimisvõtmed) ja tagastab nende väärtuste järgi järjestatud objektid. Töötavate protsesside väljundit on lihtne sortida CPU kulutatud aja järgi (cpu omadus):

Get-Process | Sort-Object –Property cpu

Parameetri -Property saab käsu Sort-Object cmdleti kutsumisel ära jätta; seda kasutatakse vaikimisi. Pöördsortimiseks kasutage parameetrit -Kahanev:

Get-Process | Sort-Object cpu -Descending

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Objektide ja nende osade valimine

Käsu Select-Object cmdlet võimaldab valida konveieri alguses või lõpus kindla arvu objekte, kasutades parameetreid -First või -Last. Tema abiga saab valida üksikuid objekte või teatud atribuute ning luua ka nende põhjal uusi objekte. Vaatame lihtsate näidete abil, kuidas cmdlet töötab.

Järgmine käsk kuvab teavet 10 protsessi kohta, mis tarbivad maksimaalselt RAM-i (WS-i omadus):

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

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Saate valida ainult konveieri läbivate objektide teatud atribuute ja luua nende põhjal uusi:

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

Torujuhtme töö tulemusena saame uue objekti, mille struktuur erineb Get-Process cmdleti poolt tagastatavast struktuurist. Kontrollime seda funktsiooni Get-Member abil:

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

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Pange tähele, et Select-Object tagastab ühe objekti (-First 1), millel on ainult kaks meie määratud välja: nende väärtused kopeeriti esimesest objektist, mille käsus Get-Process cmdlet edastas konveierisse. Üks PowerShelli skriptides objektide loomise viisidest põhineb Select-Object kasutamisel:

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

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Funktsiooni Select-Object abil saate lisada arvutatud atribuute objektidele, mida tuleb esitada kui räsi tabelid. Sel juhul vastab selle esimese võtme väärtus atribuudi nimele ja teise võtme väärtus praeguse torujuhtme elemendi atribuudi väärtusele:

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

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Vaatame konveierit läbivate objektide struktuuri:

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

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Iga objekti jaoks, rühma objektiks ja mõõtmiseks objektiks

Objektidega töötamiseks on ka teisi cmdlet-faile. Näitena räägime kolmest kõige kasulikumast:

Iga objekti jaoks võimaldab teil käivitada PowerShelli koodi iga konveieri objekti jaoks:

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

Rühm-objekt rühmitab objektid atribuudi väärtuse järgi:

Group-Object PropertyName

Kui käivitate selle parameetriga -NoElement, saate teada rühmade elementide arvu.

Mõõt-Objekt koondab erinevad kokkuvõtlikud parameetrid konveieri objektivälja väärtuste järgi (arvutab summa ja leiab ka minimaalse, maksimaalse või keskmise väärtuse):

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

Tavaliselt kasutatakse kirjeldatud cmdlet-faile interaktiivselt ja need luuakse sageli skriptidena. funktsioonid plokkidega Begin, Process ja End.

.NET- ja COM-objektide loomine (New-Object)

NET Core ja COM-liidestega tarkvarakomponente on palju, mis on süsteemiadministraatoritele kasulikud. Klassi System.Diagnostics.EventLog kasutades saate hallata süsteemiloge otse Windows PowerShellist. Vaatame näidet selle klassi eksemplari loomisest, kasutades cmdleti New-Object parameetriga -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Kuna me ei määranud konkreetset sündmuste logi, ei sisalda saadud klassi eksemplar andmeid. Selle muutmiseks peate selle loomise ajal kutsuma välja spetsiaalse konstruktorimeetodi, kasutades parameetrit -ArgumentList. Kui soovime juurdepääsu rakenduse logile, peaksime konstruktorile argumendina edastama stringi "Application":

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

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Pange tähele, et salvestasime käsu väljundi muutujasse $AppLog. Kuigi torujuhtmeid kasutatakse tavaliselt interaktiivses režiimis, nõuab skriptide kirjutamine sageli objektile viitamise säilitamist. Lisaks sisalduvad .NET Core'i põhiklassid süsteemi nimeruumis: PowerShell otsib vaikimisi selles kindlaid tüüpe, seega on System.Diagnostics.EventLogi asemel Diagnostics.EventLog kirjutamine üsna õige.

Logiga töötamiseks võite kasutada sobivaid meetodeid:

$AppLog | Get-Member -MemberType Method

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Oletame, et see kustutatakse meetodi Clear() abil, kui juurdepääsuõigused on olemas:

$AppLog.Clear()

New-Object cmdlet-i kasutatakse ka COM-komponentidega töötamiseks. Neid on päris palju – alates Windowsi skriptiserveriga kaasas olevatest raamatukogudest kuni ActiveX-i rakendusteni, nagu Internet Explorer. COM-objekti loomiseks peate määrama parameetri -ComObject soovitud klassi programmilise ProgId-ga:

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

Oma suvalise struktuuriga objektide loomiseks tundub New-Objecti kasutamine liiga arhailine ja tülikas; seda cmdlet-käsku kasutatakse PowerShelli väliste tarkvarakomponentidega töötamiseks. Järgmistes artiklites käsitletakse seda küsimust üksikasjalikumalt. Lisaks .NET ja COM objektidele uurime ka CIM (WMI) ja ADSI objekte.

Staatiliste meetodite kutsumine

Mõnda .NET Core klassi ei saa instantseerida, sealhulgas System.Environment ja System.Math. Nemad on staatiline ja sisaldavad ainult staatilisi omadusi ja meetodeid. Need on sisuliselt viiteteegid, mida kasutatakse objekte loomata. Staatilisele klassile saate viidata literaali kaudu, lisades tüübinime nurksulgudesse. Kui aga vaatame objekti struktuuri Get-Member abil, näeme System.Environment asemel tüüpi System.RuntimeType:

[System.Environment] | Get-Member

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Ainult staatiliste liikmete vaatamiseks helistage Get-Member parameetriga -Static (pange tähele objekti tüüpi):

[System.Environment] | Get-Member -Static

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Staatiliste omaduste ja meetodite kasutamiseks kasutage punkti asemel kahte järjestikust koolonit pärast literaali:

[System.Environment]::OSVersion

Või

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

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Tippige PSCustomObject

PowerShellis saadaolevate arvukate andmetüüpide hulgas tasub mainida PSCustomObjecti, mis on mõeldud suvalise struktuuriga objektide salvestamiseks. Sellise objekti loomist cmdleti New-Object abil peetakse klassikaliseks, kuid tülikaks ja aegunud viisiks:

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

Vaatame objekti struktuuri:

$object | Get-Member

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Alates versioonist PowerShell 3.0 on saadaval veel üks süntaks:

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

Andmetele pääsete juurde ühel samaväärsetest viisidest:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Siin on näide olemasoleva räsitabeli teisendamiseks objektiks:

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

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Seda tüüpi objektide üks puudusi on see, et nende omaduste järjekord võib muutuda. Selle vältimiseks peate kasutama atribuuti [ordered]:

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

Objekti loomiseks on ka teisi võimalusi: ülal vaatlesime cmdleti kasutamist Vali objekt. Jääb vaid nuputada elementide lisamine ja eemaldamine. Eelmise näite objekti puhul on selle tegemine üsna lihtne:

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

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Add-Member cmdlet võimaldab lisada varem loodud $objektile mitte ainult atribuute, vaid ka meetodeid, kasutades konstruktsiooni "-MemberType ScriptMethod":

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

Pange tähele, et uue meetodi koodi salvestamiseks kasutasime ScriptBlock tüüpi muutujat $ScriptBlock.

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Omaduste eemaldamiseks kasutage vastavat meetodit:

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

Oma klasside loomine

PowerShell 5.0 tutvustas defineerimisvõimalust klassid kasutades objektorienteeritud programmeerimiskeeltele iseloomulikku süntaksit. Selleks on ette nähtud teenindussõna klass, mille järel peaksite määrama klassi nime ja kirjeldama selle keha operaatori sulgudes:

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

See on tõeline .NET Core tüüp, mille põhiosa kirjeldab selle omadusi, meetodeid ja muid elemente. Vaatame näidet kõige lihtsama klassi määratlemisest:

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

Objekti (klassi eksemplari) loomiseks kasutage cmdleti Uus-objekt, või [MyClass] tüüpi literaal ja pseudostaatiline meetod uus (vaikekonstruktor):

$object = New-Object -TypeName MyClass

või

$object = [MyClass]::new()

Analüüsime objekti struktuuri:

$object | Get-Member

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Ärge unustage ulatust: te ei saa viidata tüübinimele stringina ega kasutada tüübiliteraali väljaspool skripti või moodulit, milles klass on määratletud. Sel juhul saavad funktsioonid tagastada klassi eksemplare (objekte), mis on juurdepääsetavad väljaspool moodulit või skripti.

Pärast objekti loomist sisestage selle omadused:

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

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Pange tähele, et klassi kirjeldus määrab mitte ainult atribuutide tüübid, vaid ka nende vaikeväärtused:

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

Klassimeetodi kirjeldus sarnaneb funktsiooni kirjeldusega, kuid ilma funktsioonisõna kasutamata. Nagu funktsiooni puhul, edastatakse parameetrid vajadusel meetoditele:

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

Nüüd võib meie klassi esindaja naeratada:

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

Meetodid võivad olla ülekoormatud, lisaks on klassil staatilised omadused ja meetodid, samuti konstruktorid, mille nimed langevad kokku klassi enda nimega. Skriptis või PowerShelli moodulis määratletud klass võib olla teise aluseks – nii rakendatakse pärimist. Sel juhul on lubatud baasklassidena kasutada olemasolevaid .NET-klasse:

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

Meie PowerShelli objektidega töötamise kirjeldus on vaevalt ammendav. Järgmistes väljaannetes püüame seda praktiliste näidetega süvendada: seeria viies artikkel on pühendatud PowerShelli integreerimise probleemidele kolmandate osapoolte tarkvarakomponentidega. Varasemad osad leiate allolevatelt linkidelt.

1. osa: Windows PowerShelli põhifunktsioonid
2. osa: Windows PowerShelli programmeerimiskeele sissejuhatus
Osa 3: parameetrite edastamine skriptidele ja funktsioonidele, cmdlet-ide loomine

Mis on Windows PowerShell ja milleks seda kasutatakse? 4. osa: Töö objektidega, oma klassid

Allikas: www.habr.com

Lisa kommentaar