PowerShell interpretearen leihoko komandoen testu-irteera informazioa giza pertzepziorako egokia den forma batean bistaratzeko modu bat besterik ez da. Egia esan, asteazkena objektuekin lan egiteko: cmdlet-ek eta funtzioek sarrera gisa jasotzen dituzte eta , 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
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. (garraiatzailea edo kanalizazioa). Pipelineko komando bakoitzak bere irteera hurrengoari pasatzen dio txandaka, objektuz objektu. Prozesatzeko, konpilatutako cmdlet-ak erabil ditzakezu edo zurea sortu kanalean 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:

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 
Hemen dagoeneko ikusten dugu mota eta egitura, eta parametro osagarrien laguntzaz, adibidez, sarreran sartutako objektuaren propietateak soilik bistaratu ditzakegu:
Get-Process | Get-Member -MemberType PropertyEzagutza 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 arteko script blokea exekutatzearen emaitza balio boolearra izan behar da. Egia bada ($true), Where-Object cmdlet-era pasatako objektua kanalizaziotik behera pasatuko da; bestela ($false balioa), ezabatuko da. Adibidez, gelditutako zerbitzuen zerrenda bat bistaratuko dugu. Windows Server, hau da, Status propietateak “Geldituta” balioa dutenak:
Get-Service | Where-Object {$_.Status -eq "Stopped"} 
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 
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 
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 
Kanaletik pasatzen diren objektuen propietate batzuk soilik hauta ditzakezu eta haietan oinarrituta berriak sor ditzakezu:
Get-Process | Select-Object ProcessName, Id -First 1Pipelinearen 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 
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() 
Hautatu-Objektua erabiliz, kalkulatutako propietateak gehi ditzakezu gisa irudikatu behar diren objektuei . 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}} 
Ikus dezagun garraiagailutik pasatzen diren objektuen egitura:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member 
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 -SumNormalean, eztabaidatutako cmdlet-ak modu interaktiboan erabiltzen dira, eta sarritan scriptetan sortzen dira. Hasi, Prozesu eta Amaiera blokeekin.
.NET eta COM objektuak sortzea (Objektu berria)
.NET Core eta COM interfazeekin software osagai asko daude, sistemaren administratzaileentzat erabilgarriak direnak. System.Diagnostics.EventLog klasea erabiliz, sistemaren erregistroak zuzenean kudea ditzakezu hemendik: Windows PowerShell. Ikus dezagun klase honen instantzia bat sortzeko adibide bat, New-Object cmdlet-a erabiliz eta -TypeName parametroarekin:
New-Object -TypeName System.Diagnostics.EventLog 
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 
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 
Demagun Clear() metodoak garbitzen duela sarbide-eskubideak badaude:
$AppLog.Clear()New-Object cmdlet-a COM osagaiekin lan egiteko ere erabiltzen da. Horietako asko daude, zerbitzariarekin batera emandako script-etatik. Windows liburutegiak ActiveX aplikazioetarako, hala nola Internet Explorer-erako. COM objektu bat sortzeko, -ComObject parametroa zehaztu behar duzu nahi duzun klasearen ProgId-arekin:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObjectZure 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 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 
Kide estatikoak soilik ikusteko, deitu Get-Member -Static parametroarekin (kontuan izan objektu mota):
[System.Environment] | Get-Member -Static 
Propietate eta metodo estatikoetara sartzeko, erabili bi bi puntu jarraian literalaren ondoko puntu baten ordez:
[System.Environment]::OSVersionedo
$test=[System.Math]::Sqrt(25)
$test
$test.GetType() 
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 
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()

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

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.

Propietateak kentzeko, erabili dagokion metodoa:
$object.psobject.properties.remove('Name')
Zure klaseak sortzea
PowerShell 5.0-k definitzeko gaitasuna sartu zuen 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 , edo [MyClass] eta motako literal bat berria (eraikitzaile lehenetsia):
$object = New-Object -TypeName MyClassedo
$object = [MyClass]::new()Azter dezagun objektuaren egitura:
$object | Get-Member 
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

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