PowerShelli interpretaatori akna käskude tekstiväljund on lihtsalt viis teabe kuvamiseks inimese tajumiseks sobival kujul. Tegelikult kolmapäeval
Оглавление
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
Objektide struktuuri vaatamine
Näiteks käivitame Get-Process cmdlet-i, mis võimaldab hankida teavet süsteemis töötavate protsesside kohta:
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
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"}
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
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
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
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
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()
Funktsiooni Select-Object abil saate lisada arvutatud atribuute objektidele, mida tuleb esitada kui
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Vaatame konveierit läbivate objektide struktuuri:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
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.
.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
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
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
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
[System.Environment] | Get-Member
Ainult staatiliste liikmete vaatamiseks helistage Get-Member parameetriga -Static (pange tähele objekti tüüpi):
[System.Environment] | Get-Member -Static
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()
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
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()
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
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
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.
Omaduste eemaldamiseks kasutage vastavat meetodit:
$object.psobject.properties.remove('Name')
Oma klasside loomine
PowerShell 5.0 tutvustas defineerimisvõimalust
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
$object = New-Object -TypeName MyClass
või
$object = [MyClass]::new()
Analüüsime objekti struktuuri:
$object | Get-Member
Ä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
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
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.
Allikas: www.habr.com