PowerShell interpretearen leihoko komandoen testu-irteera informazioa giza pertzepziorako egokia den forma batean bistaratzeko modu bat besterik ez da. Egia esan, asteazkena
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.
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 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"}
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 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
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
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 -Sum
Normalean, eztabaidatutako cmdlet-ak modu interaktiboan erabiltzen dira, eta sarritan scriptetan sortzen dira.
.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
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 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
[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]::OSVersion
edo
$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
$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
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
$object = New-Object -TypeName MyClass
edo
$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
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