Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

De tekstútfier fan kommando's yn it PowerShell-tolkfinster is gewoan in manier om ynformaasje wer te jaan yn in foarm dy't geskikt is foar minsklike waarnimming. Eins woansdei rjochte om te wurkjen mei objekten: cmdlets en funksjes ûntfange se as ynfier en werom by de útgong, en de fariabele typen beskikber ynteraktyf en yn skripts binne basearre op .NET klassen. Yn it fjirde artikel fan 'e searje sille wy it wurk mei objekten yn mear detail bestudearje.

Ynhâldsopjefte:

Objekten yn PowerShell
Besjoch de struktuer fan objekten
Filterjen fan objekten
It sortearjen fan objekten
Selektearje objekten en harren dielen
ForEach-Object, Group-Object en Measure-Object
NET- en COM-objekten oanmeitsje (New-Object)
Calling Static Metoaden
Typ PSCustomObject
It meitsjen fan jo eigen klassen

Objekten yn PowerShell

Lit ús ûnthâlde dat in objekt is in samling fan gegevens fjilden (eigenskippen, eveneminten, ensfh) en metoaden foar it ferwurkjen fan harren (metoaden). Syn struktuer wurdt oantsjutte troch in type, dat is meastal basearre op klassen brûkt yn de ferienige .NET Core platfoarm. It is ek mooglik om te wurkjen mei COM, CIM (WMI) en ADSI objekten. Eigenskippen en metoaden binne nedich om ferskate aksjes op gegevens út te fieren; boppedat kinne yn PowerShell objekten wurde trochjûn as arguminten nei funksjes en cmdlets, har wearden tawiisd oan fariabelen, en d'r is ek kommando gearstalling meganisme (conveyor of pipeline). Elk kommando yn 'e pipeline jout syn útfier nei de folgjende troch, objekt foar objekt. Foar ferwurking kinne jo kompilearre cmdlets brûke of jo eigen meitsje avansearre funksjesom ferskate manipulaasjes út te fieren mei objekten yn 'e pipeline: filterjen, sortearjen, groepearje en sels har struktuer feroarje. It ferstjoeren fan gegevens yn dizze foarm hat in serieus foardiel: it ûntfangende team hoecht de bytestream (tekst) net te parsearjen, alle nedige ynformaasje wurdt maklik ophelle troch de passende eigenskippen en metoaden te roppen.

Besjoch de struktuer fan objekten

Litte wy bygelyks de Get-Process cmdlet útfiere, wêrtroch jo ynformaasje kinne krije oer de prosessen dy't yn it systeem rinne:

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

It sil wat opmakke tekstgegevens werjaan dy't gjin idee jouwe oer de eigenskippen fan 'e weromjûne objekten en har metoaden. Om de útfier te fine, moatte wy leare hoe't jo de struktuer fan objekten ûndersiikje, en de Get-Member cmdlet sil ús hjirmei helpe:

Get-Process | Get-Member

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Hjir sjogge wy al it type en de struktuer, en mei help fan ekstra parameters kinne wy, bygelyks, allinich de eigenskippen fan it objekt werjaan yn 'e ynfier:

Get-Process | Get-Member -MemberType Property

Dizze kennis sil nedich wêze om administraasjeproblemen ynteraktyf op te lossen of jo eigen skripts te skriuwen: bygelyks om ynformaasje te krijen oer hongprosessen mei it Responding-eigenskip.

Filterjen fan objekten

PowerShell lit objekten dy't foldogge oan in bepaalde betingst troch in pipeline wurde trochjûn:

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

It resultaat fan it útfieren fan it skriptblok binnen de heakjes moat in Booleaanske wearde wêze. As it wier is ($true), sil it objekt dat wurdt ynfierd nei de Where-Object cmdlet trochjûn wurde lâns de pipeline, oars ($false) sil it wiske wurde. Litte wy bygelyks in list sjen litte fan stoppe Windows Server-tsjinsten, d.w.s. dyjingen waans Status-eigenskip is ynsteld op "Stopped":

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

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Hjir sjogge wy wer in tekstuele foarstelling, mar as jo it type en ynterne struktuer fan 'e objekten dy't troch de pipeline passe wolle begripe, is it net dreech:

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

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

It sortearjen fan objekten

By it ferwurkjen fan objekten yn pipeline is d'r faaks ferlet om se te sortearjen. De Sort-Object cmdlet wurdt trochjûn de nammen fan eigenskippen (sortearjen kaaien) en jout objekten oardere troch harren wearden. It is maklik om de útfier fan rinnende prosessen te sortearjen op CPU-tiid (cpu-eigenskip):

Get-Process | Sort-Object –Property cpu

De parameter -Property kin weilitten wurde by it oproppen fan de Sort-Object cmdlet; it wurdt standert brûkt. Foar omkearde sortearring, brûk de parameter -Descending:

Get-Process | Sort-Object cpu -Descending

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Selektearje objekten en harren dielen

De cmdlet Select-Object lit jo in spesifyk oantal objekten selektearje oan it begjin of ein fan in pipeline mei de parameters -First of -Last. Mei har help kinne jo inkele objekten of bepaalde eigenskippen selektearje, en ek nije objekten oanmeitsje op basis dêrfan. Litte wy sjen nei hoe't de cmdlet wurket mei ienfâldige foarbylden.

It folgjende kommando toant ynformaasje oer de 10 prosessen dy't de maksimale hoemannichte RAM konsumearje (WS-eigenskip):

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

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Jo kinne allinich bepaalde eigenskippen selektearje fan objekten dy't troch de pipeline passe en nije oanmeitsje op basis dêrfan:

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

As gefolch fan 'e operaasje fan' e pipeline krije wy in nij objekt, wêrfan de struktuer sil ferskille fan 'e struktuer weromjûn troch de Get-Process cmdlet. Litte wy dit ferifiearje mei Get-Member:

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

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Tink derom dat Select-Object in inkeld objekt weromjout (-Earste 1) dat mar twa fan 'e fjilden hat dy't wy spesifisearre hawwe: har wearden waarden kopieare fan it earste objekt dat yn' e pipeline trochjûn is troch de Get-Process cmdlet. Ien fan 'e manieren om objekten te meitsjen yn PowerShell-skripts is basearre op it brûken fan Select-Object:

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

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Mei help fan Select-Object kinne jo berekkene eigenskippen tafoegje oan objekten dy't moatte wurde fertsjintwurdige as hash tabellen. Yn dit gefal komt de wearde fan 'e earste kaai oerien mei de eigendomsnamme, en de wearde fan' e twadde kaai komt oerien mei de eigendomswearde foar it hjoeddeistige pipeline-elemint:

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

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Litte wy sjen nei de struktuer fan objekten dy't troch de cunewalde passe:

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

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

ForEach-Object, Group-Object en Measure-Object

D'r binne oare cmdlets foar wurkjen mei objekten. As foarbyld, litte wy prate oer de trije meast brûkbere:

Foar elk-objekt kinne jo PowerShell-koade útfiere foar elk objekt yn 'e pipeline:

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

Groep-Objekt groepearret objekten op eigenskipswearde:

Group-Object PropertyName

As jo ​​it útfiere mei de parameter -NoElement, kinne jo it oantal eleminten yn 'e groepen fine.

Maatregel-Objekt sammelt ferskate gearfettingsparameters troch objektfjildwearden yn 'e pipeline (berekkent de som, en fynt ek de minimale, maksimum of gemiddelde wearde):

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

Typysk wurde de besprutsen cmdlets ynteraktyf brûkt, en wurde faak makke yn skripts. funksjes mei begjin, proses en ein blokken.

NET- en COM-objekten oanmeitsje (New-Object)

D'r binne in protte softwarekomponinten mei .NET Core- en COM-ynterfaces dy't nuttich binne foar systeembehearders. Mei help fan de System.Diagnostics.EventLog klasse, kinne jo beheare systeem logs direkt út Windows PowerShell. Litte wy nei in foarbyld sjen fan it meitsjen fan in eksimplaar fan dizze klasse mei de New-Object cmdlet mei de parameter -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Sûnt wy hawwe net oantsjutte in spesifyk barren log, de resultearjende eksimplaar fan de klasse befettet gjin gegevens. Om dit te feroarjen, moatte jo in spesjale konstruktormetoade neame by it oanmeitsjen mei de parameter -ArgumentList. As wy tagong wolle ta it applikaasjelogboek, moatte wy de tekenrige "Applikaasje" as argumint trochjaan oan de konstruktor:

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

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Tink derom dat wy de útfier fan it kommando bewarre hawwe yn 'e $AppLog fariabele. Hoewol't pipelines faak brûkt wurde yn ynteraktive modus, fereasket it skriuwen fan skripts faak in ferwizing nei in objekt te behâlden. Dêrnjonken binne de kearn .NET Core-klassen befette yn 'e Systeemnammeromte: PowerShell siket standert dêryn nei spesifisearre typen, dus it skriuwen fan Diagnostics.EventLog ynstee fan System.Diagnostics.EventLog is hielendal korrekt.

Om mei it log te wurkjen kinne jo de passende metoaden brûke:

$AppLog | Get-Member -MemberType Method

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Litte wy sizze dat it wurdt wiske troch de metoade Clear () as d'r tagongsrjochten binne:

$AppLog.Clear()

De New-Object cmdlet wurdt ek brûkt om te wurkjen mei COM-komponinten. D'r binne nochal in protte - fan 'e biblioteken dy't wurde levere mei de Windows-skriptserver oant ActiveX-applikaasjes, lykas Internet Explorer. Om in COM-objekt te meitsjen, moatte jo de parameter -ComObject ynstelle mei it programmatyske ProgId fan 'e winske klasse:

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

Om jo eigen objekten te meitsjen mei in willekeurige struktuer, it brûken fan New-Object liket te archaysk en omslachtig; dizze cmdlet wurdt brûkt om te wurkjen mei softwarekomponinten bûten PowerShell. Yn takomstige artikels sil dit probleem yn mear detail wurde besprutsen. Neist .NET- en COM-objekten sille wy ek CIM (WMI) en ADSI-objekten ûndersykje.

Calling Static Metoaden

Guon .NET Core-klassen kinne net ynstantiearre wurde, ynklusyf System.Environment en System.Math. Sy binne statysk en befetsje allinnich statyske eigenskippen en metoaden. Dit binne yn essinsje referinsjebiblioteken dy't wurde brûkt sûnder objekten te meitsjen. Jo kinne ferwize nei in statyske klasse troch in letterlike troch it ynsluten fan de type namme yn fjouwerkante heakjes. As wy lykwols nei de struktuer fan it objekt sjogge mei Get-Member, sille wy it type System.RuntimeType sjen ynstee fan System.Environment:

[System.Environment] | Get-Member

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Om allinich statyske leden te besjen, skilje Get-Member mei de parameter -Static (note it objekttype):

[System.Environment] | Get-Member -Static

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Om tagong te krijen ta statyske eigenskippen en metoaden, brûk twa opienfolgjende kolons ynstee fan in perioade nei de letterlike:

[System.Environment]::OSVersion

Or

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

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Typ PSCustomObject

Under de tal fan gegevenstypen beskikber yn PowerShell, is it it neamen wurdich PSCustomObject, ûntworpen foar it bewarjen fan objekten mei in willekeurige struktuer. It meitsjen fan sa'n objekt mei de New-Object cmdlet wurdt beskôge as in klassike, mar omslachtige en ferâldere manier:

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

Litte wy nei de struktuer fan it objekt sjen:

$object | Get-Member

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Begjin mei PowerShell 3.0 is in oare syntaksis beskikber:

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

Jo kinne tagong krije ta de gegevens op ien fan 'e lykweardige manieren:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Hjir is in foarbyld fan it konvertearjen fan in besteande hashtabel nei in objekt:

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

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Ien fan 'e neidielen fan objekten fan dit type is dat de folchoarder fan har eigenskippen kin feroarje. Om dit te foarkommen, moatte jo it attribút [besteld] brûke:

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

D'r binne oare opsjes foar it meitsjen fan in objekt: hjirboppe hawwe wy sjoen nei it brûken fan de cmdlet Selektearje-objekt. Alles wat oerbliuwt is it tafoegjen en fuortheljen fan eleminten út te finen. Dit dwaan foar it objekt fan it foarige foarbyld is frij ienfâldich:

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

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

De Add-Member cmdlet lit jo net allinich eigenskippen taheakje, mar ek metoaden oan in earder oanmakke $objekt troch de "-MemberType ScriptMethod" konstruksje te brûken:

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

Tink derom dat wy de fariabele $ScriptBlock fan type ScriptBlock brûkten om de koade foar de nije metoade op te slaan.

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Om eigenskippen te ferwiderjen, brûk de oerienkommende metoade:

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

It meitsjen fan jo eigen klassen

PowerShell 5.0 yntrodusearre de mooglikheid om te definiearjen klassen it brûken fan syntaksis karakteristyk foar objekt-rjochte programmeartalen. Dêrfoar is it tsjinstwurd Klasse bedoeld, wêrnei't jo de namme fan 'e klasse moatte opjaan en har lichem beskriuwe tusken operatorheakjes:

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

Dit is in wier .NET Core-type, mei in lichem dat syn eigenskippen, metoaden en oare eleminten beskriuwt. Litte wy nei in foarbyld sjen fan it definiearjen fan de ienfâldichste klasse:

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

Om in objekt te meitsjen (klasseeksimplaar), brûk de cmdlet Nij-Objekt, of in letterlike fan type [MyClass] en pseudostatyske metoade nij (standert konstruktor):

$object = New-Object -TypeName MyClass

of

$object = [MyClass]::new()

Litte wy de struktuer fan it objekt analysearje:

$object | Get-Member

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Ferjit net oer omfang: jo kinne net ferwize nei in type namme as in tekenrige of brûke in letterlike type bûten it skript of module wêryn de klasse is definiearre. Yn dit gefal, funksjes kinne weromjaan klasse eksimplaren (objekten) dat sil wêze tagonklik bûten de module of skript.

Nei it meitsjen fan it objekt, folje de eigenskippen yn:

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

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Tink derom dat de klassebeskriuwing net allinich de eigendomstypen spesifisearret, mar ek har standertwearden:

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

De beskriuwing fan in klassemetoade liket op de beskriuwing fan in funksje, mar sûnder it funksjewurd te brûken. Lykas yn in funksje wurde parameters trochjûn oan metoaden as nedich:

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

No kin de fertsjintwurdiger fan ús klasse glimkje:

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

Metoaden kinne oerladen wurde; boppedat hat in klasse statyske eigenskippen en metoaden, lykas konstruktors waans nammen oerienkomme mei de namme fan 'e klasse sels. In klasse definiearre yn in skript of PowerShell-module kin tsjinje as basis foar in oar - dit is hoe't erfskip wurdt ymplementearre. Yn dit gefal is it tastien om besteande .NET-klassen as basis te brûken:

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

Us beskriuwing fan wurkjen mei objekten yn PowerShell is amper útputtend. Yn 'e folgjende publikaasjes sille wy besykje it te ferdjipjen mei praktyske foarbylden: it fyfde artikel yn' e searje sil wijd wurde oan 'e problemen fan yntegraasje fan PowerShell mei softwarekomponinten fan tredden. Eardere dielen binne te finen op de ûndersteande links.

Diel 1: Basis Windows PowerShell-funksjes
Diel 2: Yntroduksje ta de Windows PowerShell-programmearring taal
Diel 3: parameters trochjaan oan skripts en funksjes, it meitsjen fan cmdlets

Wat is Windows PowerShell en wêr wurdt it foar brûkt? Diel 4: Wurkje mei objekten, eigen klassen

Boarne: www.habr.com

Add a comment