Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

KĂ€skude tekstiline vĂ€ljund PowerShelli tĂ”lgendaja aknas on lihtsalt teabe kuvamise viis, mis on inimsĂ”bralik. Tegelikult on keskkond on suunatud objektide töötlemiseks: cmdlet'id ja funktsioonid saavad neid sisendina ja tagastavad vĂ€ljundina, samas kui interaktiivses reĆŸiimis ja skriptides saadaval olevad muutuja tĂŒĂŒbid pĂ”hinevad .NET-i klassidel. Selle artikli neljandas osas uurime objektide töötamist pĂ”hjalikumalt.

Sisukord:

Objektid PowerShellis
Objektide struktuuri vaatamine
Objektide filtreerimine
Objektide sorteerimine
Objektide ja nende osade esiletoomine
ForEach-Object, Group-Object ja Measure-Object
Objektide loomine .NET ja COM (New-Object)
Statiliste meetodite kutsumine
TĂŒĂŒp PSCustomObject
Oma klasside loomine

Objektid PowerShellis

Tuletame meelde, et objekt on andmevĂ€ljade (omaduste, sĂŒndmuste jne) kogum ja nende töötlemise meetodid. Selle struktuuri mÀÀrab tĂŒĂŒp, mis pĂ”hineb tavaliselt .NET Core'i standardiseeritud klassidel. Samuti on vĂ”imalik töötada COM, CIM (WMI) ja ADSI objektidega. Omadused ja meetodid on vajalikud erinevate toimingute tĂ€itmiseks andmetega; PowerShellis saavad objektid olla argumentideks funktsioonides ja kĂ€skudes, nende vÀÀrtusi saab mÀÀrata muutujatele, ja samuti on olemas kĂ€skude kompositsiooni mehhanism (toru ehk pipeline). Iga kĂ€sk torus edastab oma vĂ€ljundi jĂ€rgmiseks jĂ€rjestikku — objekt objekti jĂ€rel. Töötlemiseks saab kasutada kompileeritud kĂ€sklusi vĂ”i luua oma laiendatud funktsioonid, et objekti töötlemiseks voos erinevaid manipulatsioone: filtreerimine, sorteerimine, rĂŒhmitamine ja isegi nende struktuuri muutmine. Andmete edastamine sellisel kujul on mĂ€rkimisvÀÀrne eelis: vastuvĂ”tv meeskond ei pea tegelema baitide (teksti) sĂŒntaktilise analĂŒĂŒsiga, kogu vajalik teave on lihtsasti ekstraheeritav, kui pöörduda vastavate omaduste ja meetodite poole.

Objektide struktuuri vaatamine

NĂ€iteks kĂ€ivitame Get-Process kĂ€skluse, mis annab teavet sĂŒsteemis töötavate protsesside kohta:

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

See vĂ€ljastab ekraanile mĂ”ned vormindatud tekstilised andmed, mis ei anna ĂŒlevaadet tagastatud objektide omadustest ja nende meetoditest. VĂ€ljundi peeneks analĂŒĂŒsimiseks tuleb Ă”ppida uurima objektide struktuuri, ja siin aitab meid kĂ€sklus Get-Member:

Get-Process | Get-Member

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Siin nĂ€eme juba tĂŒĂŒpi ja struktuuri, ja tĂ€iendavate parameetrite abil saame nĂ€iteks vĂ€ljastada ainult sisenenud objekti omadused:

Get-Process | Get-Member -MemberType Property

Need to know this to handle administration tasks interactively or to write custom scripts, for instance, to retrieve information about hanging processes based on the Responding property.

Objektide filtreerimine

PowerShell allows for passing objects through the pipeline that meet certain conditions:

Where-Object { script block }

The result of executing the script block within the parentheses must be a boolean value. If it is true ($true), the object passing into the Where-Object cmdlet will be sent further down the pipeline; otherwise (the value $false), it will be removed. For example, let’s list the stopped Windows Server services, i.e., those whose Status property is ‘Stopped’:

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

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Here, we again see a textual representation, but it's easy to understand the type and internal structure of the objects passing through the pipeline if desired:

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

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Objektide sorteerimine

Objektide konveieritöötlemisel esineb sageli vajadus nende sorteerimiseks. Cmdletile Sort-Object edastatakse sorteerimisvÔtmete nimed ja see tagastab objektid, mis on jÀrjekorda seatud nende vÀÀrtuste pÔhjal. KÀimasolevaid protsesse ei ole keeruline sorteerida nende kulutatud protsessori aja (cpu omaduse) alusel:

Get-Process | Sort-Object –Property cpu

Cmdleti Sort-Object kĂ€su kutsumise puhul ei ole parameetrit -Property tingimata mÀÀrata — see on vaikimisi kasutusel. Tagurpidi sorteerimiseks kasutatakse parameetrit -Descending:

Get-Process | Sort-Object cpu -Descending

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Objektide ja nende osade esiletoomine

Cmdlet Select-Object vĂ”imaldab valida teatud arvu objekte konveieri alguses vĂ”i lĂ”pus parameetrite -First vĂ”i -Last abil. Selle abil on vĂ”imalik valida ĂŒksikobjekte vĂ”i spetsiifilisi omadusi ning luua nende pĂ”hjal uusi objekte. Vaadakem cmdleti tööd lihtsate nĂ€idete kaudu.

JÀrgmine kÀsk nÀitab teavet 10 kÔige rohkem mÀlu tarbiva protsessi (WS omadus) kohta:

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

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Saate valida ainult teatud omadused konveieris liikuvate objektide seast ja luua nende pÔhjal uusi:

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

Tulemusena saame uue objekti, mille struktuur erineb Get-Process'i kÀivitatud struktuurist. Vaadake seda Get-Member'i abil:

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

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Pange tĂ€hele, et Select-Object tagastab ĂŒhe objekti (-First 1), millel on ainult kaks meie mÀÀratud vĂ€ljad: nende vÀÀrtused on kopeeritud esimesest objektist, mille Get-Process kĂ€ivitas. Select-Object'i kasutamise pĂ”hjal on PowerShellis objekti loomise ĂŒks meetoditest:

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

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Select-Object'i abil saab objektidele lisada arvutuslikke omadusi, mida tuleks esitada hÔlbustus. Sellisel juhul vastab esimese vÔtme vÀÀrtus omaduse nimele ning teise vÔtme vÀÀrtus on omaduse vÀÀrtus antud toru praeguse elemendi jaoks:

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

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Vaadakem torust lÀbi minevate objektide struktuuri:

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

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

ForEach-Object, Group-Object ja Measure-Object

Objektidega töötamiseks on olemas ka teisi kÀsurealt. NÀiteks rÀÀgime kolmest kÔige kasulikumast:

ForEach-Object kui see vÔimaldab tÀita PowerShelli keeles koodi iga toruga edastatud objekti jaoks:

ForEach-Object { skripti plokk }

Group-Object grupeerib objekte pÔhijoonte vÀÀrtuse jÀrgi:

Group-Object PropertyName

Kui kĂ€ivitada see parameetriga -NoElement, saab teada rĂŒhmades olevate elementide arvu.

Measure-Object kondenseerib erinevaid kokkuvÔtlikke parameetreid objektide vÀljade vÀÀrtuste pÔhjal (arvutab summa, samuti leiab minimaalset, maksimaalset vÔi keskmist vÀÀrtust):

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

Kasutatud kĂ€suread töötavad tavaliselt interaktiivses reĆŸiimis, samas kui skripte luuakse sagedamini funktsioonid Begin, Process ja End plokkidega.

Objektide loomine .NET ja COM (New-Object)

On palju tarkvarakomponente, millel on .NET Core ja COM liidesed, mis on sĂŒsteemiadministraatoritele kasulikud. Klassiga System.Diagnostics.EventLog saab hallata sĂŒsteemi logisid otse Windows PowerShellist. Vaatame nĂ€idet, kuidas seda klassi luua kĂ€surea New-Object abil parameetriga -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Kuna me ei mÀÀratlenud konkreetset sĂŒndmuste ajakirja, ei sisalda saadud klassi eksemplar andmeid. Selle muutmiseks tuleks selle loomise ajal kutsuda konstruktorimeetod koos parameetriga -ArgumentList. Kui soovime pÀÀseda rakenduse ajakirja, tuleb konstruktorisse edastada string "Application" argumendina:

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

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Pange tĂ€hele: kĂ€su vĂ€ljund salvestati muutujasse $AppLog. Kuigi interaktiivses reĆŸiimis kasutatakse tavaliselt torustikke, nĂ”uab skriptimine sageli objekti viite salvestamist. Lisaks sisaldavad .NET Core pĂ”hiklassid nimede ruumis System: PowerShell otsib vaikimisi seal mÀÀratud tĂŒĂŒpe, seega on Diagnostics.EventLog kirjutamine tĂ€iesti korrektne.

Ajakirjaga töötamiseks vÔib pöörduda vastavate meetodite poole:

$AppLog | Get-Member -MemberType Method

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Ütleme, et seda kustutatakse meetodi Clear() abil, kui on juurdepÀÀsuĂ”igused:

$AppLog.Clear()

Cmdlet New-Object kasutatakse ka COM-komponentidega töötamiseks. Neid on pĂ€ris palju — Windowsi serveriga kaasas olevatest skripti raamatukogudest kuni ActiveX rakendusteni, nagu nĂ€iteks Internet Explorer. COM-objekti loomiseks tuleb mÀÀrata -ComObject parameeter koos vajaliku klassi ProgId programmidentifikaatoriga:

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

Oma struktuuriga objektide loomiseks tundub New-Object kasutamine liiga arhailine ja kohmakas; seda cmdletit kasutatakse vÀliste PowerShelli programmikomponentidega töötamiseks. JÀrgmistes artiklites kÀsitleme seda teemat pÔhjalikumalt. Peale .NET ja COM objektide uurime ka CIM (WMI) ja ADSI objekte.

Statiliste meetodite kutsumine

MĂ”nede .NET Core klasside eksemplaride loomine on vĂ”imatu: nende hulka kuuluvad System.Environment ja System.Math. Need on staatilised ja sisaldavad ainult staatilisi omadusi ja meetodeid. Tegelikult on need viidete teegid, mida kasutatakse ilma objektide loomata. Viidates staatilisele klassile, saab kasutada literali, pannes tĂŒĂŒbi nime nurksulgudesse. Samuti, kui vaadata objekti struktuuri Get-Member abil, nĂ€eme tĂŒĂŒpi System.RuntimeType, mitte System.Environment:

[System.Environment] | Get-Member

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Ainult staatiliste elementide vaatamiseks tuleb kutsuda Get-Member koos parameetriga -Static (pange tĂ€hele objekti tĂŒĂŒpi):

[System.Environment] | Get-Member -Static

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Staatiliste omaduste ja meetodite juurde pÀÀsemiseks kasutatakse kahte jÀrjestikust koolonit punkti asemel pÀrast literali:

[System.Environment]::OSVersion

VÔi

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

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

TĂŒĂŒp PSCustomObject

Paljude PowerShell'i andmetĂŒĂŒpide seas vÀÀrib eraldi mainimist PSCustomObject, mis on mĂ”eldud juhusliku struktuuriga objektide hoidmiseks. Sellise objekti loomine New-Object kĂ€su kaudu on klassikaline, kuid kohmakas ja vananenud meetod:

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

Vaadakem objekti struktuuri:

$object | Get-Member

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Alates PowerShell 3.0 on saadaval ka teine sĂŒntaks:

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

Andmetele on vÔimalik juurde pÀÀseda mÔne ekvivalentse viisi kaudu:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Toome nÀite olemasoleva hashtabeli teisendamisest objektiks:

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

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Üks selle tĂŒĂŒpi objektide miinus on see, et nende omaduste jĂ€rjekord vĂ”ib muutuda. Selle vĂ€ltimiseks tuleb kasutada atribuuti [ordered]:

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

Objekti loomise jaoks on ka teisi vĂ”imalusi: eelnevalt vaatasime ĂŒle kĂ€su Select-Object. JÀÀnud on arutada elementide lisamist ja eemaldamist. Seda on eelmise nĂ€ite objekti puhul ĂŒsna lihtne teha:

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

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

KÀsk Add-Member vÔimaldab lisada juba loodud objektile $object mitte ainult omadusi, vaid ka meetodeid, kasutades konstruktsiooni "-MemberType ScriptMethod":

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

Pange tĂ€hele: uue meetodi koodi salvestamiseks kasutasime $ScriptBlock tĂŒĂŒpi ScriptBlock muutujat.

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Atribuutide eemaldamiseks kasutatakse vastavat meetodit:

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

Oma klasside loomine

PowerShell 5.0-st alates on vĂ”imalik mÀÀrata klasse kasutades objektorienteeritud programmeerimisele iseloomulikku sĂŒntaksit. Selleks on ettenĂ€htud mĂ€rksĂ”na Class, millele jĂ€rgneb klassi nimi ja selle keha kirjeldamine sulgudes:

class MyClass
{
    # klassi keha
}

See on tĂ”eline .NET Core tĂŒĂŒp, mille sees kirjeldatakse selle omadusi, meetodeid ja muid elemente. Vaatame nĂ€itena lihtsama klassi mÀÀratlemist:

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

MĂ€rksĂ”na New-Object, vĂ”i tĂŒĂŒbi literal [MyClass] ja pseudo-staatiline meetod new (vaikerakendus):

$object = New-Object -TypeName MyClass

vÔi

$object = [MyClass]::new()

AnalĂŒĂŒsime objekti struktuuri:

$object | Get-Member

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Ärge unustage nĂ€htavust: tĂŒĂŒbi nime ei saa stringina viidata ega kasutada tĂŒĂŒbi literali vĂ€ljaspool skripti vĂ”i moodulit, kusklass on mÀÀratletud. Samuti vĂ”ivad funktsioonid tagastada klassi eksemplare (objekte), mis on kergesti kĂ€ttesaadavad vĂ€ljaspool moodulit vĂ”i skripti.

PÀrast objekti loomist tÀidame selle omadused:

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

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Oluline on mĂ€rkida, et klassi kirjelduse juures mÀÀratakse mitte ainult omaduste tĂŒĂŒbid, vaid ka nende vaikimisi vÀÀrtused:

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

Klassi meetodi kirjeldus sarnaneb funktsiooni kirjeldamisele, kuid ilma vÔtmesÔna function kasutamata. Nagu funktsiooni puhul, edastatakse meetoditele vajadusel argumendid:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
     
     #meetodi kirjeldus
     Smile([bool]$param1)
     {
         If($param1) {
            Write-Host ':)'
         }
     }
}

NĂŒĂŒd oskab meie klassi esindaja naeratada:

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

Meetodeid saab ĂŒle koormata, peale selle on klassil staatilisi omadusi ja meetodeid, samuti konstruktorid, mille nimed kattuvad selle klassi nimega. PowerShellis mÀÀratletud skripti vĂ”i mooduli klass vĂ”ib olla aluseks teisele – nii teostatakse pĂ€randamine. Aluseks vĂ”ib kasutada ka olemasolevaid .NET klasse:

class MyClass2 : MyClass
{
      # uue klasse keha, mille aluseks on MyClass
}
[MyClass2]::new().Smile($true)

Meie kirjeldus PowerShelli objektide töötamisest on raske peab ammendavaks. JĂ€rgmistes postitustes pĂŒĂŒame seda sĂŒvendada praktiliste nĂ€idete abil: viies artikkel tsĂŒklis kĂ€sitletakse PowerShelli integreerimist kolmandate osapoolte tarkvarakomponentidega. Eelmised osad leiate allpool olevatest linkidest.

Osa 1: Windows PowerShelli pÔhifunktsioonid
Osa 2: sissejuhatus Windows PowerShelli programmeerimiskeelde
Osa 3: parameetrite edastamine skriptidesse ja funktsioonidesse, cmdletide loomine

Mis on Windows PowerShell ja millega seda kasutatakse? Osa 4: Töö objektidega, oma klassid

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster