KĂ€skude tekstiline vĂ€ljund PowerShelli tĂ”lgendaja aknas on lihtsalt teabe kuvamise viis, mis on inimsĂ”bralik. Tegelikult on keskkond objektide töötlemiseks: cmdlet'id ja funktsioonid saavad neid sisendina ja , 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
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 (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 , 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:

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 
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 PropertyNeed 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"} 
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 
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 cpuCmdleti 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 
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 
Saate valida ainult teatud omadused konveieris liikuvate objektide seast ja luua nende pÔhjal uusi:
Get-Process | Select-Object ProcessName, Id -First 1Tulemusena 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 
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() 
Select-Object'i abil saab objektidele lisada arvutuslikke omadusi, mida tuleks esitada . 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}} 
Vaadakem torust lÀbi minevate objektide struktuuri:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member 
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 PropertyNameKui 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 -SumKasutatud kĂ€suread töötavad tavaliselt interaktiivses reĆŸiimis, samas kui skripte luuakse sagedamini 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 
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 
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 
Ă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.FileSystemObjectOma 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 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 
Ainult staatiliste elementide vaatamiseks tuleb kutsuda Get-Member koos parameetriga -Static (pange tĂ€hele objekti tĂŒĂŒpi):
[System.Environment] | Get-Member -Static 
Staatiliste omaduste ja meetodite juurde pÀÀsemiseks kasutatakse kahte jÀrjestikust koolonit punkti asemel pÀrast literali:
[System.Environment]::OSVersionVÔi
$test=[System.Math]::Sqrt(25)
$test
$test.GetType() 
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 
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()

Ă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 . 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

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.

Atribuutide eemaldamiseks kasutatakse vastavat meetodit:
$object.psobject.properties.remove('Name')
Oma klasside loomine
PowerShell 5.0-st alates on vĂ”imalik mÀÀrata 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 , vĂ”i tĂŒĂŒbi literal [MyClass] ja new (vaikerakendus):
$object = New-Object -TypeName MyClassvÔi
$object = [MyClass]::new()AnalĂŒĂŒsime objekti struktuuri:
$object | Get-Member 
Ă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

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 , 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.
Allikas: habr.com
