KĂ€skude tekstiline vĂ€ljund PowerShelli tĂ”lgendamise aknas on lihtsalt viis nĂ€idata teavet inimlikult arusaadavas vormis. Tegelikult on keskkond töötama objektidega: kĂ€sklused ja funktsioonid saavad neid sisse ja , ning interaktiivselt ja skriptides saadaval olevad muutujate tĂŒĂŒbid pĂ”hinevad .NETi klassidel. Artikli neljandas osas uurime objektidega töötamist pĂ”hjalikumalt.
Sisukord:
Objektid PowerShellis
Tuletame meelde, et objekt on andmevĂ€ljade (omaduste, sĂŒndmuste jms) kogum ja nende töötlemise meetodite kogum. Selle struktuuri mÀÀrab tĂŒĂŒp, mis pĂ”hineb tavaliselt .NET Core klassidel. Samuti on vĂ”imalik töötada COM, CIM (WMI) ja ADSI objektidega. Omadused ja meetodid on vajalikud andmete erinevate toimingute jaoks, lisaks saab PowerShellis objekte edastada argumentidena funktsioonidesse ja kĂ€sklustesse, omistada nende vÀÀrtusi muutujatele ning on olemas (toru vĂ”i pipeline). Iga kĂ€sk torus edastab oma vĂ€ljundi jĂ€rgmisele jĂ€rjestikku â objekt objektide kaupa. Töötlemiseks saab kasutada kompileeritud kĂ€sklusi vĂ”i luua oma , et teostada erinevaid manipulatsioone objektidega torus: filtreerimist, sorteerimist, rĂŒhmitamist ja isegi nende struktuuri muutmist. Andmete edastamine sellisel kujul on tĂ”sine eelis: vastuvĂ”tval kĂ€sklil ei ole vaja tegeleda baitide (teksti) sĂŒntaktilise analĂŒĂŒsiga, kogu vajalik teave saadakse kergesti vastavate omaduste ja meetodite kaudu.
Objektide struktuuri vaatamine
NĂ€iteks kĂ€ivitame kĂ€skluse Get-Process, mis vĂ”imaldab saada teavet sĂŒsteemis töötavate protsesside kohta:

See kuvab ekraanile mĂ”ningaid vormindatud tekstilisi andmeid, mis ei anna aimu tagastatavate objektide omadustest ja nende meetoditest. VĂ€ljundi tĂ€pseks analĂŒĂŒsimiseks tuleb Ă”ppida uurima objektide struktuuri ja selleks aitab meid kĂ€sklus Get-Member:
Get-Process | Get-Member 
Siin nĂ€eme juba tĂŒĂŒpi ja struktuuri ning tĂ€iendavate parameetrite abil saame nĂ€iteks vĂ€ljastada ainult sissetuleva objekti omadused:
Get-Process | Get-Member -MemberType PropertyNeed teadmised on vajalikud haldusĂŒlesannete lahendamiseks interaktiivses reĆŸiimis vĂ”i oma skriptide kirjutamiseks: nĂ€iteks, et saada teavet hangunud protsesside kohta omaduse Responding pĂ”hjal.
Objektide filtreerimine
PowerShell vÔimaldab edastada torustiku kaudu objekte, mis vastavad teatud tingimustele:
Where-Object { skripti blokk }Skripti bloki tÀitmise tulemuseks peab olema loogiline vÀÀrtus. Kui see on tÔene ($true), edastatakse Where-Object cmdletile sissetulev objekt torustiku kaudu edasi, vastasel juhul (vÀÀrtus $false) eemaldatakse see. NÀiteks vÀljastame Windows Serveri peatatud teenuste nimekirja, st nendest, mille omadus Status on "Stopped":
Get-Service | Where-Object { $_.Status -eq "Stopped" } 
Siin nĂ€eme taas tekstilist esitluses, kuid soovi korral on lihtne mĂ”ista torustiku kaudu liikuvate objektide tĂŒĂŒpi ja sisemist seadistust:
Get-Service | Where-Object { $_.Status -eq "Stopped" } | Get-Member 
Objektide sorteerimine
Objektide torustiku töötlemisel tekib sageli vajadus neid sortida. Cmdleti Sort-Object juurde edastatakse omaduste (sortimisvÔtmete) nimed, ning see tagastab vÀÀrtuste kaupa jÀrjestatud objektid. KÀivitatud protsesside vÀljundit on lihtne sortida kulutatud protsessori aja (omaduse cpu) pÔhjal:
Get-Process | Sort-Object âProperty cpuParameetrit -Property Sort-Object cmdlet'i kutsumisel ei ole vaja nĂ€idata - see on vaikimisi kasutusel. Tagurpidi sortimise jaoks kasutatakse parameetrit -Descending:
Get-Process | Sort-Object cpu -Descending 
Objektide ja nende osade eristamine
Cmdlet Select-Object vĂ”imaldab torustiku alguses vĂ”i lĂ”pus vĂ€lja valida kindla arvu objekte parameetrite -First vĂ”i -Last abil. Selle abil saab valida ĂŒksikobjekte vĂ”i kindlaid omadusi ning luua nende pĂ”hjal uusi objekte. AnalĂŒĂŒsime cmdleti tööd lihtsate nĂ€idete abil.
JÀrgmine kÀsk vÀljastab teavet 10 protsessi kohta, mis tarbivad kÔige rohkem mÀlu (omadus WS):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10 
Saame vÀlja valida ainult kindlad omadused torustiku kaudu liikuvate objektide seast ja luua nende pÔhjal uusi:
Get-Process | Select-Object ProcessName, Id -First 1KÀitumise tulemusena saame uue objekti, mille struktuur erineb Get-Process kÀsu tagastatavast struktuurist. Kontrollime seda Get-Member abil:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member 
Pange tĂ€hele, et Select-Object tagastab ĂŒhe objekti (-First 1), millel on vaid kaks meie mÀÀratud vĂ€lja: nende vÀÀrtused on kopeeritud esimesest kĂ€sule Get-Process edastatud objektist. Select-Object'i kasutamine on ĂŒks viis, kuidas PowerShellis objekte luua:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType() 
Select-Object abil saab objektidele lisada arvutatud omadusi, mida tuleb esitada . Samal ajal vastab selle esimese vÔtme vÀÀrtus omaduse nimele ja teise omaduse vÀÀrtus on praeguse konveieri elemendi omaduse vÀÀrtus:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} 
Vaadakem, milline on konveierist lÀbi liikuvate objektide struktuur:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member 
ForEach-Object, Group-Object ja Measure-Object
Objektidega töötamiseks on ka teisi kÀske. NÀiteks rÀÀgime kolmest kÔige kasulikust:
ForEach-Object vÔimaldab PowerShelli koodi iga objekti jaoks konveieris kÀitada:
ForEach-Object { plokk }Group-Object grupid objektid vÀlja vÀÀrtuse jÀrgi:
Group-Object PropertyNameKui kĂ€ivitada see parameetriga -NoElement, saab teada rĂŒhmades olevate elementide arvu.
Measure-Object agreggeerib erinevaid kokkuvÔtvaid parameetreid objektide vÀlja vÀÀrtuste pÔhjal (arvutab summa ja leiab minimaalne, maksimaalne vÔi keskmine vÀÀrtus):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -SumTavaliselt kasutatakse kĂ€sitletud kĂ€ske interaktiivses reĆŸiimis, samas kui skriptides luuakse tihedamini Begin, Process ja End plokkidega.
Objektide loomine .NET ja COM (New-Object)
On palju .NET Core ja COM liideseid, mis on sĂŒsteemihalduritele kasuks. Klassiga System.Diagnostics.EventLog saab hallata sĂŒsteemi logisid otse Windows PowerShellis. Vaatame nĂ€idet, kuidas selle klassi eksemplari luua New-Object kĂ€su ja parameetriga -TypeName:
New-Object -TypeName System.Diagnostics.EventLog 
Kuna me ei mÀÀranud kindlat sĂŒndmuste logi, ei sisalda saadud klassi eksemplar andmeid. Selle muutmiseks tuleb selle loomise ajal kutsuda vĂ€lja spetsiaalne konstruktorimeetod, kasutades parameetrit -ArgumentList. Kui soovime pÀÀseda rakenduse logile, tuleb konstruktorisse edastada argument âApplicationâ:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog 
Pange tĂ€hele: kĂ€su vĂ€ljund on salvestatud muutuja $AppLog. Kuigi interaktiivses reĆŸiimis kasutatakse tavaliselt torusid, nĂ”uab skriptide kirjutamine sageli objekti viite sĂ€ilitamist. Lisaks sisaldavad .NET Core pĂ”hiklassid nimespacing System: PowerShell otsib vaikimisi nende tĂŒĂŒpide seast, seega on tĂ€iesti korrektne kirjutada Diagnostics.EventLog asemel System.Diagnostics.EventLog.
Logiga töötades saab kasutada vastavaid meetodeid:
$AppLog | Get-Member -MemberType Method 
Oletame, et see puhastatakse meetodi Clear() abil, kui on olemas Ôigused:
$AppLog.Clear()Cmdlet New-Object kasutatakse ka COM-komponentidega töötamiseks. Neid on ĂŒsna palju â alates Windowsi serveritega tarnitavatest skriptide raamatukogudest kuni ActiveX-rakendusteni, nagu nĂ€iteks Internet Explorer. COM-objekti loomiseks tuleb mÀÀrata parameeter -ComObject koos vajaliku klassi ProgId programmide identifikaatoriga:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObjectOma struktuuriga kohandatud objektide loomine New-Object-i abil nĂ€eb liiga arhailine ja mahukas vĂ€lja; see cmdlet on mĂ”eldud PowerShellile vĂ€liste programmide komponentidega töötamiseks. JĂ€rgmistes artiklites kĂ€sitleme seda kĂŒsimust pĂ”hjalikumalt. Lisaks .NET ja COM-objektidele uurime ka CIM (WMI) ja ADSI objekte.
Statiliste meetodite kutsumine
MĂ”ne .NET Core klassi eksemplari loomine on vĂ”imatu: nende hulka kuuluvad System.Environment ja System.Math. Need on ja sisaldavad ainult staatilisi omadusi ja meetodeid. Sisuliselt on need viidatud raamatukogud, mida kasutatakse ilma objektide loomata. Statilisse klassi viidatakse literali kaudu, kirjutades tĂŒĂŒbi nime neljandatesse sulgudesse. 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 
Juhtimiseks staatilistele omadustele ja meetoditele kasutatakse kahe jÀrjestikuse kooloni asemel punkti pÀrast literali:
[System.Environment]::OSVersionVÔi
$test=[System.Math]::Sqrt(25)
$test
$test.GetType() 
TĂŒĂŒp PSCustomObject
Rohkemate PowerShelli andmetĂŒĂŒpide seas vÀÀrib eraldi mainimist PSCustomObject, mis on mĂ”eldud struktuuri poolest vabade objektide hoidmiseks. Sellise objekti loomine New-Object kĂ€suga on klassikaline, kuid mahukas 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-st on saadaval ka teine sĂŒntaks:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Andmetele pÀÀseb ligi ĂŒhe jĂ€rgmise ekvivalentse meetodi kaudu:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Toome nÀite olemasoleva hÀshtabeli objekti konvertimisest:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()

Ăks selle tĂŒĂŒbi objektide puudustest on see, et nende omaduste jĂ€rjekord vĂ”ib muutuda. Selle vĂ€ltimiseks on vajalik kasutada atribuuti [ordered]:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Objekti loomisel on ka teisi variante: eespool kĂ€sitleme kĂ€su . JÀÀb veel aru saada elementide lisamisest ja eemaldamisest. Seda on eelneva 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 muutujat $ScriptBlock, mille tĂŒĂŒp on ScriptBlock.

Oma omaduste eemaldamiseks kasutatakse vastavat meetodit:
$object.psobject.properties.remove('Name')
Oma klasside loomine
PowerShell 5.0-s ilmnes vĂ”imalus mÀÀratleda kasutades objekt-orienteeritud programmeerimiskeelte sĂŒntaksit. Selleks on ette nĂ€htud sĂ”na Class, millele jĂ€rgneb klassi nimi ja selle keha kirjeldamine sulguvatesse joontesse:
class MyClass
{
# klassi keha
}
See on tegelik .NET Core tĂŒĂŒp, mille sees on kirjeldatud selle omadusi, meetodeid ja muid elemente. Vaatame lihtsa klassi mÀÀratlemise nĂ€idet:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Objekti (klassi eksemplari) loomiseks kasutatakse kĂ€sku , vĂ”i tĂŒĂŒp [MyClass] ja new (vaikimisi konstruktor):
$object = New-Object -TypeName MyClassvÔi
$object = [MyClass]::new()AnalĂŒĂŒsime objekti struktuuri:
$object | Get-Member 
Ei tohi unustada ulatust: ei tohi viidata tĂŒĂŒbile nime stringina ega kasutada tĂŒĂŒpide kirjeldust skripti vĂ”i mooduli vĂ€ljaspool, kus klass on mÀÀratletud. Samal ajal vĂ”ivad funktsioonid tagastada klasside eksemplare (objekte), mis on saadaval 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

MĂ€rkimisvÀÀrne on see, et klassi mÀÀratluses mÀÀratakse mitte ainult omaduste tĂŒĂŒbid, vaid ka nende vaikimisi vÀÀrtused:
class Example
{
[string]$Name = 'John Doe'
}
Klassi meetodi mÀÀratlemine meenutab funktsiooni mÀÀratlemist, kuid ilma sÔna function kasutamiseta. Nagu funktsioonis, saavad meetodid vajadusel parameetreid:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#meetodi mÀÀratlemine
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
NĂŒĂŒd suudab meie klassi esindaja naeratada:
$object = [MyClass]::new()
$object.Smile($true)
Meetodeid saab ĂŒle koormata, lisaks vĂ”ivad klassil olla , samuti konstruktorid, mille nimed kattuvad klassi nimega ise. PowerShellis skripti vĂ”i moodulis mÀÀratletud klass vĂ”ib olla aluseks teisele â nii teostatakse pĂ€randamine. Alusklassideks vĂ”ivad olla olemasolevad .NET klassid:
class MyClass2 : MyClass
{
#uue klassi keha, mille alusklass on MyClass
}
[MyClass2]::new().Smile($true)
Meie PowerShelli objektidega töötamise kirjeldust on raske tĂ€ielikuks nimetada. JĂ€rgmistes postitustes pĂŒĂŒame seda sĂŒvendada praktiliste nĂ€idete pĂ”hjal: tsĂŒkli viies artikkel kĂ€sitleb PowerShelli integreerimist kolmandate osapoolte tarkvarakomponentidega. Varasemad osad leiate allpool olevatest linkidest.
Allikas: habr.com
