Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

PowerShell interpretearen leihoko komandoen testu-irteera informazioa giza pertzepziorako egokia den forma batean bistaratzeko modu bat besterik ez da. Egia esan, asteazkena orientatua objektuekin lan egiteko: cmdlet-ek eta funtzioek sarrera gisa jasotzen dituzte eta irteeran itzuli zen, eta interaktiboki eta scriptetan eskuragarri dauden aldagai motak .NET klaseetan oinarritzen dira. Serieko laugarren artikuluan objektuekin lan egitea zehatzago aztertuko dugu.

Edukien taula:

PowerShellen objektuak
Objektuen egitura ikustea
Objektuak iragaztea
Objektuak ordenatzea
Objektuak eta haien zatiak hautatzea
ForEach-Object, Taldea-Objektua eta Neurria-Objektua
.NET eta COM objektuak sortzea (Objektu berria)
Metodo estatikoei deitzea
Idatzi PSCustomObject
Zure klaseak sortzea

PowerShellen objektuak

Gogora dezagun objektu bat datu-eremuen (propietateak, gertaerak, etab.) eta horiek prozesatzeko metodoen (metodoen) bilduma bat dela. Bere egitura mota batek zehazten du, normalean .NET Core plataforma bateratuan erabiltzen diren klaseetan oinarritzen dena. COM, CIM (WMI) eta ADSI objektuekin ere lan egin daiteke. Propietateak eta metodoak behar dira datuetan hainbat ekintza burutzeko; gainera, PowerShell-en, objektuak argumentu gisa pasa daitezke funtzioei eta cmdletei, haien balioak aldagaiei esleitu eta ere badago. komando-konposizio-mekanismoa (garraiatzailea edo kanalizazioa). Pipelineko komando bakoitzak bere irteera hurrengoari pasatzen dio txandaka, objektuz objektu. Prozesatzeko, konpilatutako cmdlet-ak erabil ditzakezu edo zurea sortu ezaugarri aurreratuakkanalean dauden objektuekin hainbat manipulazio egiteko: iragaztea, ordenatzea, taldekatzea eta baita haien egitura aldatzea ere. Datuak formulario honetan transferitzeak abantaila handia du: talde hartzaileak ez du byte-jarioa (testua) analizatu beharrik, beharrezko informazio guztia erraz lortzen da propietate eta metodo egokiak deituz.

Objektuen egitura ikustea

Adibidez, exekuta dezagun Get-Process cmdlet-a, sisteman exekutatzen diren prozesuei buruzko informazioa lortzeko aukera ematen duena:

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Itzulitako objektuen propietateei eta haien metodoei buruzko ideiarik ematen ez duten formateatutako testu-datu batzuk bistaratuko ditu. Irteera doitzeko, objektuen egitura aztertzen ikasi behar dugu, eta Get-Member cmdlet-ak horretan lagunduko digu:

Get-Process | Get-Member

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Hemen dagoeneko ikusten dugu mota eta egitura, eta parametro osagarrien laguntzaz, adibidez, sarreran sartutako objektuaren propietateak soilik bistaratu ditzakegu:

Get-Process | Get-Member -MemberType Property

Ezagutza hori beharrezkoa izango da administrazio-arazoak modu interaktiboan konpontzeko edo zure script-ak idazteko: adibidez, Responding propietatea erabiliz eskegitako prozesuei buruzko informazioa lortzeko.

Objektuak iragaztea

PowerShellek baldintza jakin bat betetzen duten objektuak kanalizazio batetik pasatzeko aukera ematen du:

Where-Object { Π±Π»ΠΎΠΊ сцСнария }

Parentesi artean dagoen script-blokea exekutatzeko emaitzak balio boolearra izan behar du. Egia bada ($true), Where-Object cmdlet-ean sartzen den objektua kanalizazioan zehar pasatuko da, bestela ($false) ezabatu egingo da. Adibidez, bistaratu dezagun gelditutako Windows Server zerbitzuen zerrenda, hau da. Egoeraren propietatea "Gehituta" gisa ezarrita dutenek:

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

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Hemen berriro irudikapen testual bat ikusiko dugu, baina kanalizaziotik pasatzen diren objektuen mota eta barne egitura ulertu nahi baduzu ez da zaila:

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

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Objektuak ordenatzea

Objektuak kanalizatzen direnean, sarritan ordenatu beharra dago. Sort-Object cmdlet-ari propietateen izenak pasatzen zaizkio (ordenatzeko gakoak) eta objektuak beren balioen arabera ordenatuta itzultzen ditu. Erraza da exekutatzen ari diren prozesuen irteera PUZaren denboraren arabera ordenatzea (cpu propietatea):

Get-Process | Sort-Object –Property cpu

-Property parametroa Sort-Object cmdlet-a deitzean ezaba daiteke; lehenespenez erabiltzen da. Alderantzizko ordenatzeko, erabili -Beheranzko parametroa:

Get-Process | Sort-Object cpu -Descending

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Objektuak eta haien zatiak hautatzea

Select-Object cmdlet-ak kanalizazio baten hasieran edo amaieran objektu kopuru zehatz bat hautatzeko aukera ematen du -First edo -Last parametroak erabiliz. Bere laguntzarekin, objektu bakarrak edo propietate jakin batzuk hauta ditzakezu, eta haietan oinarrituta objektu berriak ere sor ditzakezu. Ikus dezagun cmdlet-ak nola funtzionatzen duen adibide errazak erabiliz.

Hurrengo komandoak RAM kopuru maximoa (WS propietatea) kontsumitzen duten 10 prozesuei buruzko informazioa bistaratzen du:

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

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Kanaletik pasatzen diren objektuen propietate batzuk soilik hauta ditzakezu eta haietan oinarrituta berriak sor ditzakezu:

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

Pipelinearen funtzionamenduaren ondorioz, objektu berri bat jasoko dugu, eta horren egitura Get-Process cmdlet-ak itzultzen duen egituratik desberdina izango da. Egiazta dezagun hau Get-Member erabiliz:

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

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Kontuan izan Select-Object-ek objektu bakarra itzultzen duela (-First 1) zehaztu ditugun eremuetatik bi baino ez dituena: haien balioak Get-Process cmdlet-ak kanalizaziora pasatako lehen objektutik kopiatu zituen. PowerShell scriptetan objektuak sortzeko moduetako bat Select-Object erabiltzean oinarritzen da:

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

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Hautatu-Objektua erabiliz, kalkulatutako propietateak gehi ditzakezu gisa irudikatu behar diren objektuei hash taulak. Kasu honetan, bere lehen gakoaren balioa propietatearen izenari dagokio eta bigarren gakoaren balioa uneko kanalizazio-elementuaren propietate-balioari dagokio:

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

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Ikus dezagun garraiagailutik pasatzen diren objektuen egitura:

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

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

ForEach-Object, Taldea-Objektua eta Neurria-Objektua

Objektuekin lan egiteko beste cmdlet batzuk daude. Adibide gisa, hitz egin ditzagun hiru erabilgarrienei buruz:

Objektu bakoitzeko kanalizazioko objektu bakoitzerako PowerShell kodea exekutatzeko aukera ematen du:

ForEach-Object { Π±Π»ΠΎΠΊ сцСнария }

Taldea-Objektua objektuak propietate-balioaren arabera taldekatzen ditu:

Group-Object PropertyName

-NoElement parametroarekin exekutatzen baduzu, taldeetako elementu kopurua jakin dezakezu.

Neurria-Objektua Hainbat laburpen-parametro batzen ditu kanaleko objektu-eremuen balioen arabera (batuketa kalkulatzen du eta balio minimoa, maximoa edo batez bestekoa ere aurkitzen du):

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

Normalean, eztabaidatutako cmdlet-ak modu interaktiboan erabiltzen dira, eta sarritan scriptetan sortzen dira. funtzio Hasi, Prozesu eta Amaiera blokeekin.

.NET eta COM objektuak sortzea (Objektu berria)

Sistema administratzaileentzat erabilgarriak diren .NET Core eta COM interfazeekin software osagai asko daude. System.Diagnostics.EventLog klasea erabiliz, sistemaren erregistroak zuzenean kudea ditzakezu Windows PowerShell-etik. Ikus dezagun klase honen instantzia bat sortzeko New-Object cmdlet-a erabiliz -TypeName parametroarekin:

New-Object -TypeName System.Diagnostics.EventLog

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Gertaeren erregistro zehatzik zehaztu ez dugunez, klasearen ondoriozko instantziak ez du daturik. Hau aldatzeko, eraikitzaile-metodo berezi bati deitu behar diozu sortzean -ArgumentList parametroa erabiliz. Aplikazioaren erregistrora sartu nahi badugu, "Aplikazioa" katea pasa beharko genioke argumentu gisa eraikitzaileari:

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

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Kontuan izan komandoaren irteera $AppLog aldagaian gorde dugula. Nahiz eta kanalizazioak modu interaktiboan erabili ohi diren, scriptak idazteak maiz objektu baten erreferentzia mantentzea eskatzen du. Gainera, oinarrizko .NET Core klaseak Sistemaren izen-espazioan daude: PowerShell-ek modu lehenetsian zehaztutako motak bilatzen ditu bertan, beraz, Diagnostics.EventLog idaztea System.Diagnostics.EventLog-en ordez nahiko zuzena da.

Erregistroarekin lan egiteko, metodo egokiak erabil ditzakezu:

$AppLog | Get-Member -MemberType Method

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Demagun Clear() metodoak garbitzen duela sarbide-eskubideak badaude:

$AppLog.Clear()

New-Object cmdlet COM osagaiekin lan egiteko ere erabiltzen da. Horietako asko daude: Windows script zerbitzariarekin hornitutako liburutegietatik hasi eta ActiveX aplikazioetaraino, Internet Explorer adibidez. COM objektu bat sortzeko, -ComObject parametroa nahi duzun klaseko ProgId programatikoarekin ezarri behar duzu:

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

Zure objektuak egitura arbitrarioarekin sortzeko, New-Object erabiltzea arkaikoegia eta astuna dirudi; cmdlet hau PowerShell-etik kanpoko software osagaiekin lan egiteko erabiltzen da. Etorkizuneko artikuluetan gai hau zehatzago eztabaidatuko da. .NET eta COM objektuez gain, CIM (WMI) eta ADSI objektuak ere aztertuko ditugu.

Metodo estatikoei deitzea

.NET Core klase batzuk ezin dira instantziatu, System.Environment eta System.Math barne. Haiek dira estatikoa eta propietate eta metodo estatikoak baino ez dituzte. Funtsean, objekturik sortu gabe erabiltzen diren erreferentzia-liburutegiak dira. Klase estatiko bati erreferentzia egin dezakezu literal baten bidez, motaren izena kortxete artean sartuta. Hala ere, Get-Member erabiliz objektuaren egiturari erreparatzen badiogu, System.RuntimeType mota ikusiko dugu System.Environment-en ordez:

[System.Environment] | Get-Member

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Kide estatikoak soilik ikusteko, deitu Get-Member -Static parametroarekin (kontuan izan objektu mota):

[System.Environment] | Get-Member -Static

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Propietate eta metodo estatikoetara sartzeko, erabili bi bi puntu jarraian literalaren ondoko puntu baten ordez:

[System.Environment]::OSVersion

edo

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

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Idatzi PSCustomObject

PowerShell-en dauden datu-mota ugarien artean, aipatzekoa da PSCustomObject, egitura arbitrarioa duten objektuak gordetzeko diseinatua. Objektu bat sortzea New-Object cmdlet-a erabiliz modu klasikotzat hartzen da, baina astuna eta zaharkitua:

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

Ikus dezagun objektuaren egitura:

$object | Get-Member

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

PowerShell 3.0-tik hasita, beste sintaxi bat dago eskuragarri:

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

Datuetara sartzeko modu baliokideetako batean egin dezakezu:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Hona hemen lehendik dagoen hashtable bat objektu bihurtzeko adibide bat:

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

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Mota honetako objektuen desabantaila bat haien propietateen ordena alda daitekeela da. Hori ekiditeko, [ordenatua] atributua erabili behar duzu:

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

Objektu bat sortzeko beste aukera batzuk daude: goian cmdlet-a erabiliz aztertu dugu Hautatu-Object. Elementuak gehitzea eta kentzea da geratzen dena. Aurreko adibideko objekturako hau egitea nahiko erraza da:

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

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Add-Member cmdlet-ak aldez aurretik sortutako $objektu bati propietateak ez ezik metodoak ere gehi ditzakezu "-MemberType ScriptMethod" eraikuntza erabiliz:

$ScriptBlock = {
    # ΠΊΠΎΠ΄ 
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member

Kontuan izan ScriptBlock motako $ScriptBlock aldagaia erabili dugula metodo berriaren kodea gordetzeko.

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Propietateak kentzeko, erabili dagokion metodoa:

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

Zure klaseak sortzea

PowerShell 5.0-k definitzeko gaitasuna sartu zuen klaseak objektuetara zuzendutako programazio lengoaien sintaxiaren ezaugarria erabiliz. Klase zerbitzu-hitza honetarako pentsatuta dago, ondoren klasearen izena zehaztu eta haren gorputza operadoreen parentesi artean deskribatu beharko zenuke:

class MyClass
{
    # Ρ‚Π΅Π»ΠΎ класса
}

Benetako .NET Core mota bat da, bere propietateak, metodoak eta beste elementu batzuk deskribatzen dituen gorputz batekin. Ikus dezagun klase sinpleena definitzeko adibide bat:

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

Objektu bat (klase-instantzia) sortzeko, erabili cmdlet-a Berria-Objektua, edo [MyClass] eta motako literal bat metodo pseudoestatikoa berria (eraikitzaile lehenetsia):

$object = New-Object -TypeName MyClass

edo

$object = [MyClass]::new()

Azter dezagun objektuaren egitura:

$object | Get-Member

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Ez ahaztu esparruaz: ezin duzu mota-izen bat kate gisa aipatu edo motako literal bat erabili klasea definitzen den script edo modulutik kanpo. Kasu honetan, funtzioek modulutik edo scriptetik kanpo eskuragarri egongo diren klase-instantziak (objektuak) itzul ditzakete.

Objektua sortu ondoren, bete bere propietateak:

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

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Kontuan izan klasearen deskribapenak propietate motak ez ezik, balio lehenetsiak ere zehazten dituela:

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

Klase metodo baten deskribapenak funtzio baten deskribapenaren antza du, baina funtzio hitza erabili gabe. Funtzio batean bezala, beharrezkoa izanez gero, parametroak metodoetara pasatzen dira:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
     
     #описаниС ΠΌΠ΅Ρ‚ΠΎΠ΄Π°
     Smile([bool]$param1)
     {
         If($param1) {
            Write-Host ':)'
         }
     }
}

Orain gure klaseko ordezkariak irribarre egin dezake:

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

Metodoak gainkargatu daitezke; gainera, klase batek ere badu propietate eta metodo estatikoak, baita izenak klasearen beraren izenarekin bat datozen eraikitzaileak ere. Script edo PowerShell modulu batean definitutako klase batek beste baten oinarri gisa balio dezake - horrela inplementatzen da herentzia. Kasu honetan, lehendik dauden .NET klaseak oinarrizko gisa erabiltzea onartzen da:

class MyClass2 : MyClass
{
      #Ρ‚Π΅Π»ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ класса, Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся MyClass
}
[MyClass2]::new().Smile($true)

PowerShell-en objektuekin lan egiteari buruzko deskribapena ia ez da zehatza. Ondorengo argitalpenetan, adibide praktikoekin sakontzen saiatuko gara: serieko bosgarren artikulua PowerShell hirugarrenen software-osagaiekin integratzearen gaiei buruzkoa izango da. Iraganeko zatiak beheko esteketan aurki daitezke.

1. zatia: Windows PowerShell-en oinarrizko ezaugarriak
2. zatia: Windows PowerShell Programazio Lengoaiaren sarrera
3. zatia: script eta funtzioetara parametroak pasatzea, cmdlet-ak sortzea

Zer da Windows PowerShell eta zertarako erabiltzen da? 4. zatia: Objektuekin lan egitea, klase propioak

Iturria: www.habr.com

Gehitu iruzkin berria