Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Komentojen tekstitulostus PowerShell-tulkkiikkunassa on vain tapa näyttää tietoa ihmisen havainnointiin sopivassa muodossa. Itse asiassa keskiviikkona suuntautunut työskennellä objektien kanssa: cmdletit ja funktiot vastaanottavat ne syötteenä ja palasi uloskäynnille, ja vuorovaikutteisesti ja skripteissä saatavilla olevat muuttujatyypit perustuvat .NET-luokkiin. Sarjan neljännessä artikkelissa tutkimme esineiden kanssa työskentelemistä tarkemmin.

Vastaaja:

Objektit PowerShellissä
Esineiden rakenteen tarkastelu
Objektien suodatus
Objektien lajittelu
Esineiden ja niiden osien valinta
ForEach-Object, Group-Object ja Measure-Object
.NET- ja COM-objektien luominen (New-Object)
Staattisten menetelmien kutsuminen
Kirjoita PSCustomObject
Omien kurssien luominen

Objektit PowerShellissä

Muistetaan, että objekti on kokoelma tietokenttiä (ominaisuudet, tapahtumat jne.) ja menetelmiä niiden käsittelemiseksi (metodeja). Sen rakenteen määrittelee tyyppi, joka yleensä perustuu yhtenäistetyssä .NET Core -alustassa käytettyihin luokkiin. On myös mahdollista työskennellä COM-, CIM- (WMI)- ja ADSI-objektien kanssa. Ominaisuuksia ja menetelmiä tarvitaan erilaisten toimintojen suorittamiseen tiedoilla, lisäksi PowerShellissä objekteja voidaan välittää argumenteina funktioille ja cmdleteille, määrittää niiden arvot muuttujille, ja siellä on myös komentokokoonpanomekanismi (kuljetin tai putki). Jokainen liukuhihnan komento välittää tulostensa seuraavalle vuorollaan objekti kerrallaan. Käsittelyyn voit käyttää koottuja cmdlet-komentoja tai luoda omia lisäominaisuuksiasuorittaa erilaisia ​​käsittelyjä valmisteilla olevilla kohteilla: suodattaa, lajitella, ryhmitellä ja jopa muuttaa niiden rakennetta. Tietojen lähettämisessä tässä muodossa on vakava etu: vastaanottavan tiimin ei tarvitse jäsentää tavuvirtaa (tekstiä), kaikki tarvittava tieto on helposti noudettavissa kutsumalla sopivia ominaisuuksia ja menetelmiä.

Esineiden rakenteen tarkastelu

Suoritetaan esimerkiksi Get-Process cmdlet, jonka avulla voit saada tietoja järjestelmässä käynnissä olevista prosesseista:

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Se näyttää joitakin muotoiltuja tekstitietoja, jotka eivät anna mitään käsitystä palautettujen objektien ominaisuuksista ja niiden menetelmistä. Tulostuksen hienosäätöä varten meidän on opittava tutkimaan objektien rakennetta, ja Get-Member-cmdlet auttaa meitä tässä:

Get-Process | Get-Member

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Täällä näemme jo tyypin ja rakenteen, ja lisäparametrien avulla voimme esimerkiksi näyttää vain syötteeseen sisältyvän objektin ominaisuudet:

Get-Process | Get-Member -MemberType Property

Tätä tietoa tarvitaan hallinnollisten ongelmien ratkaisemiseen interaktiivisesti tai omien komentosarjojen kirjoittamiseen: esimerkiksi tietojen saamiseksi ripustetuista prosesseista Responding-ominaisuuden avulla.

Objektien suodatus

PowerShell sallii tietyn ehdon täyttävien objektien kuljettamisen liukuhihnan läpi:

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

Suluissa olevan komentosarjalohkon suorittamisen tuloksen on oltava looginen arvo. Jos se on tosi ($true), Where-Object-cmdletiin syötetty objekti välitetään liukuhihnaa pitkin, muuten ($false) se poistetaan. Näytetään esimerkiksi luettelo pysäytetyistä Windows Server -palveluista, ts. ne, joiden Status-ominaisuuden arvo on "Pysäytetty":

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

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Tässä taas näemme tekstiesityksen, mutta jos haluat ymmärtää putkilinjan läpi kulkevien objektien tyypin ja sisäisen rakenteen, se ei ole vaikeaa:

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

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Objektien lajittelu

Esineiden liukuhihnakäsittelyssä on usein tarve lajitella ne. Sort-Object-cmdlet välittyy ominaisuuksien nimet (lajitteluavaimet) ja palauttaa objektit arvojensa mukaan järjestetyssä järjestyksessä. Käynnissä olevien prosessien tulosteet on helppo lajitella suorittimen kulutetun ajan mukaan (prosessoriominaisuus):

Get-Process | Sort-Object –Property cpu

-Property-parametri voidaan jättää pois kutsuttaessa Sort-Object-cmdlet-komentoa; sitä käytetään oletuksena. Käytä käänteiseen lajitteluun -Descending -parametria:

Get-Process | Sort-Object cpu -Descending

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Esineiden ja niiden osien valinta

Select-Object -cmdletin avulla voit valita tietyn määrän objekteja liukuhihnan alussa tai lopussa käyttämällä -First- tai -Last -parametreja. Sen avulla voit valita yksittäisiä objekteja tai tiettyjä ominaisuuksia sekä luoda niiden perusteella uusia objekteja. Katsotaanpa, miten cmdlet toimii yksinkertaisten esimerkkien avulla.

Seuraava komento näyttää tiedot 10 prosessista, jotka kuluttavat enimmäismäärän RAM-muistia (WS-ominaisuus):

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

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Voit valita vain tiettyjä liukuhihnan läpi kulkevien objektien ominaisuuksia ja luoda uusia ominaisuuksia niiden perusteella:

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

Liukuhihnan toiminnan seurauksena saamme uuden objektin, jonka rakenne eroaa Get-Process cmdletin palauttamasta rakenteesta. Varmistetaan tämä Get-Memberin avulla:

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

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Huomaa, että Select-Object palauttaa yhden objektin (-First 1), jossa on vain kaksi määrittämäämme kenttää: niiden arvot kopioitiin ensimmäisestä objektista, jonka Get-Process-cmdlet välitti liukuhihnaan. Yksi tavoista luoda objekteja PowerShell-skripteissä perustuu Select-Objectin käyttöön:

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

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Käyttämällä Select-Object-toimintoa voit lisätä laskettuja ominaisuuksia objekteihin, jotka on esitettävä hash-taulukoita. Tässä tapauksessa sen ensimmäisen avaimen arvo vastaa ominaisuuden nimeä ja toisen avaimen arvo vastaa nykyisen liukuhihnaelementin ominaisuuden arvoa:

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

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Katsotaanpa kuljettimen läpi kulkevien esineiden rakennetta:

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

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

ForEach-Object, Group-Object ja Measure-Object

Objektien kanssa työskentelemiseen on muitakin cmdlet-komentoja. Puhutaanpa esimerkkinä kolmesta hyödyllisimmästä:

Jokaiselle esineelle voit suorittaa PowerShell-koodin kullekin liukuhihnassa olevalle objektille:

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

Ryhmä-objekti ryhmittelee objektit ominaisuuden arvon mukaan:

Group-Object PropertyName

Jos suoritat sen parametrilla -NoElement, saat selville ryhmien elementtien lukumäärän.

Measure-Object kokoaa erilaisia ​​yhteenvetoparametreja objektikentän arvojen mukaan liukuhihnassa (laskee summan ja löytää myös minimi-, maksimi- tai keskiarvon):

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

Yleensä käsiteltyjä cmdlet-komentoja käytetään interaktiivisesti, ja ne luodaan usein komentosarjoilla. tehtävät Begin-, Process- ja End-lohkoilla.

.NET- ja COM-objektien luominen (New-Object)

On monia ohjelmistokomponentteja, joissa on .NET Core- ja COM-liitännät, joista on hyötyä järjestelmänvalvojille. System.Diagnostics.EventLog-luokan avulla voit hallita järjestelmälokeja suoraan Windows PowerShellistä. Katsotaanpa esimerkkiä tämän luokan ilmentymän luomisesta New-Object-cmdletillä parametrin -TypeName kanssa:

New-Object -TypeName System.Diagnostics.EventLog

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Koska emme määrittäneet tiettyä tapahtumalokia, tuloksena oleva luokan esiintymä ei sisällä tietoja. Jos haluat muuttaa tätä, sinun on kutsuttava erityinen konstruktorimenetelmä sen luomisen aikana käyttämällä -ArgumentList-parametria. Jos haluamme käyttää sovelluslokia, meidän tulee välittää merkkijono "Application" argumenttina rakentajalle:

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

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Huomaa, että tallensimme komennon tulosteen $AppLog-muuttujaan. Vaikka liukuputkia käytetään yleisesti interaktiivisessa tilassa, komentosarjojen kirjoittaminen vaatii usein viittauksen säilyttämistä objektiin. Lisäksi ydin.NET Core -luokat sisältyvät System-nimiavaruuteen: PowerShell etsii oletusarvoisesti siitä tiettyjä tyyppejä, joten Diagnostics.EventLog-tiedoston kirjoittaminen System.Diagnostics.EventLogin sijaan on aivan oikein.

Voit työskennellä lokin kanssa sopivilla menetelmillä:

$AppLog | Get-Member -MemberType Method

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Oletetaan, että se tyhjennetään Clear()-menetelmällä, jos käyttöoikeuksia on:

$AppLog.Clear()

New-Object-cmdlet-komentoa käytetään myös COM-komponenttien kanssa työskentelemiseen. Niitä on melko paljon - Windowsin komentosarjapalvelimen mukana toimitetuista kirjastoista ActiveX-sovelluksiin, kuten Internet Exploreriin. COM-objektin luomiseksi sinun on asetettava -ComObject-parametri halutun luokan ohjelmallisella ProgId:llä:

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

Omien objektien luominen mielivaltaisella rakenteella New-Objectin käyttö näyttää liian vanhanaikaiselta ja hankalalta; tätä cmdlet-komentoa käytetään PowerShellin ulkoisten ohjelmistokomponenttien kanssa työskentelemiseen. Tulevissa artikkeleissa tätä asiaa käsitellään tarkemmin. NET- ja COM-objektien lisäksi tutkimme myös CIM- (WMI)- ja ADSI-objekteja.

Staattisten menetelmien kutsuminen

Joitakin .NET Core -luokkia ei voida toteuttaa, mukaan lukien System.Environment ja System.Math. He ovat staattinen ja sisältävät vain staattisia ominaisuuksia ja menetelmiä. Nämä ovat pohjimmiltaan viitekirjastoja, joita käytetään luomatta objekteja. Voit viitata staattiseen luokkaan literaalin kautta lisäämällä tyypin nimen hakasulkeisiin. Jos kuitenkin tarkastelemme objektin rakennetta Get-Memberillä, näemme tyypin System.RuntimeType System.Environment:n sijaan:

[System.Environment] | Get-Member

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Jos haluat tarkastella vain staattisia jäseniä, kutsu Get-Member -Static-parametrilla (huomaa objektityyppi):

[System.Environment] | Get-Member -Static

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Jos haluat käyttää staattisia ominaisuuksia ja menetelmiä, käytä kahta peräkkäistä kaksoispistettä pisteen sijaan literaalin jälkeen:

[System.Environment]::OSVersion

tai

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

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Kirjoita PSCustomObject

PowerShellissä saatavilla olevista lukuisista tietotyypeistä kannattaa mainita PSCustomObject, joka on suunniteltu mielivaltaisen rakenteen omaavien objektien tallentamiseen. Tällaisen objektin luomista New-Object-cmdletillä pidetään klassisena, mutta hankalana ja vanhentuneena tapana:

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

Katsotaanpa kohteen rakennetta:

$object | Get-Member

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

PowerShell 3.0:sta alkaen toinen syntaksi on saatavilla:

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

Voit käyttää tietoja jollakin vastaavista tavoista:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Tässä on esimerkki olemassa olevan hash-taulukon muuntamisesta objektiksi:

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

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Yksi tämäntyyppisten objektien haitoista on, että niiden ominaisuuksien järjestys voi muuttua. Tämän välttämiseksi sinun on käytettävä [ordered]-attribuuttia:

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

Objektin luomiseen on muitakin vaihtoehtoja: edellä tarkastelimme cmdlet-komentoa Valitse-Object. Jäljelle jää vain elementtien lisääminen ja poistaminen. Tämän tekeminen edellisen esimerkin objektille on melko yksinkertaista:

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

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Add-Member -cmdlet antaa sinun lisätä ominaisuuksien lisäksi myös menetelmiä aiemmin luotuun $objektiin käyttämällä "-MemberType ScriptMethod" -rakennetta:

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

Huomaa, että käytimme ScriptBlock-tyyppistä $ScriptBlock-muuttujaa uuden menetelmän koodin tallentamiseen.

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Voit poistaa ominaisuuksia käyttämällä vastaavaa menetelmää:

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

Omien kurssien luominen

PowerShell 5.0 esitteli mahdollisuuden määritellä luokat käyttäen olio-ohjelmointikielille ominaista syntaksia. Tätä varten on tarkoitettu palvelusana Class, jonka jälkeen sinun tulee määrittää luokan nimi ja kuvata sen runko suluissa:

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

Tämä on todellinen .NET Core -tyyppi, jonka runko kuvaa sen ominaisuuksia, menetelmiä ja muita elementtejä. Katsotaanpa esimerkkiä yksinkertaisimman luokan määrittämisestä:

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

Luo objekti (luokkainstanssi) cmdlet-komennolla Uusi-objekti, tai literaali tyyppiä [MyClass] ja pseudostaattinen menetelmä uusi (oletuskonstruktori):

$object = New-Object -TypeName MyClass

tai

$object = [MyClass]::new()

Analysoidaan objektin rakennetta:

$object | Get-Member

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Älä unohda laajuutta: et voi viitata tyypin nimeen merkkijonona tai käyttää tyyppiliteraalia sen komentosarjan tai moduulin ulkopuolella, jossa luokka on määritelty. Tässä tapauksessa funktiot voivat palauttaa luokkaesiintymiä (objekteja), jotka ovat käytettävissä moduulin tai komentosarjan ulkopuolella.

Kun olet luonut objektin, täytä sen ominaisuudet:

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

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Huomaa, että luokan kuvaus ei määrittele vain ominaisuustyypit, vaan myös niiden oletusarvot:

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

Luokkametodin kuvaus muistuttaa funktion kuvausta, mutta ilman funktiosanaa. Kuten funktiossa, parametrit välitetään tarvittaessa menetelmille:

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

Nyt luokkamme edustaja voi hymyillä:

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

Menetelmät voivat olla ylikuormitettuja, lisäksi luokassa on staattiset ominaisuudet ja menetelmät, sekä rakentajat, joiden nimet ovat samat kuin itse luokan nimi. Skriptissä tai PowerShell-moduulissa määritetty luokka voi toimia pohjana toiselle - näin periytyminen toteutetaan. Tässä tapauksessa olemassa olevia .NET-luokkia saa käyttää perusluokina:

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

Kuvauksemme objektien kanssa työskentelemisestä PowerShellissä on tuskin tyhjentävä. Seuraavissa julkaisuissa yritämme syventää sitä käytännön esimerkein: sarjan viides artikkeli on omistettu PowerShellin integroimiseen kolmansien osapuolien ohjelmistokomponentteihin. Aiemmat osat löytyvät alla olevista linkeistä.

Osa 1: Windows PowerShellin perusominaisuudet
Osa 2: Johdatus Windows PowerShell -ohjelmointikieleen
Osa 3: parametrien välittäminen skripteille ja funktioille, cmdlet-komentojen luominen

Mikä on Windows PowerShell ja mihin sitä käytetään? Osa 4: Objektien kanssa työskentely, omat luokat

Lähde: will.com

Lisää kommentti