Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Die teksuitvoer van opdragte in die PowerShell-tolkvenster is net 'n manier om inligting te vertoon in 'n vorm wat geskik is vir menslike persepsie. Eintlik Woensdag georiënteerd om met voorwerpe te werk: cmdlets en funksies ontvang hulle as invoer en by die uitgang teruggekeer, en die veranderlike tipes wat interaktief en in skrifte beskikbaar is, is gebaseer op .NET-klasse. In die vierde artikel van die reeks gaan ons die werk met voorwerpe in meer besonderhede bestudeer.

INHOUDSOPGAWE:

Voorwerpe in PowerShell
Kyk na die struktuur van voorwerpe
Filter van voorwerpe
Sorteer voorwerpe
Seleksie van voorwerpe en hul dele
Vir Elke-Object, Groep-Object en Meet-Object
Skep .NET- en COM-voorwerpe (New-Object)
Oproep van statiese metodes
Tik PSCustomObject
Skep jou eie klasse

Voorwerpe in PowerShell

Kom ons onthou dat 'n objek 'n versameling datavelde (eienskappe, gebeurtenisse, ens.) en metodes om dit te verwerk (metodes) is. Die struktuur daarvan word gespesifiseer deur 'n tipe, wat gewoonlik gebaseer is op klasse wat in die verenigde .NET Core-platform gebruik word. Dit is ook moontlik om met COM, CIM (WMI) en ADSI voorwerpe te werk. Eienskappe en metodes is nodig om verskeie aksies op data uit te voer; Daarbenewens, in PowerShell, kan voorwerpe as argumente na funksies en cmdlets deurgegee word, hul waardes aan veranderlikes toegeken word, en daar is ook opdrag samestelling meganisme (vervoerband of pyplyn). Elke opdrag in die pyplyn gee sy uitset om die beurt aan die volgende een, voorwerp vir voorwerp. Vir verwerking kan jy saamgestelde cmdlets gebruik of jou eie skep gevorderde kenmerkeom verskeie manipulasies met voorwerpe in die pyplyn uit te voer: filter, sortering, groepering en selfs die verandering van hul struktuur. Die oordrag van data in hierdie vorm het 'n ernstige voordeel: die ontvangende span hoef nie die greepstroom (teks) te ontleed nie, al die nodige inligting word maklik opgespoor deur die toepaslike eienskappe en metodes te bel.

Kyk na die struktuur van voorwerpe

Laat ons byvoorbeeld die Get-Process cmdlet laat loop, wat jou toelaat om inligting te bekom oor die prosesse wat in die stelsel loop:

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Dit sal sommige geformateerde teksdata vertoon wat geen idee gee oor die eienskappe van die teruggekeerde voorwerpe en hul metodes nie. Om die uitset te verfyn, moet ons leer hoe om die struktuur van voorwerpe te ondersoek, en die Get-Lid-cmdlet sal ons hiermee help:

Get-Process | Get-Member

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Hier sien ons reeds die tipe en struktuur, en met behulp van addisionele parameters kan ons byvoorbeeld slegs die eienskappe van die voorwerp wat in die invoer ingesluit is, vertoon:

Get-Process | Get-Member -MemberType Property

Hierdie kennis sal nodig wees om administrasieprobleme interaktief op te los of om jou eie skrifte te skryf: byvoorbeeld om inligting te bekom oor opgehangde prosesse deur die Responding-eienskap te gebruik.

Filter van voorwerpe

PowerShell laat toe dat voorwerpe wat aan 'n sekere voorwaarde voldoen, deur 'n pyplyn gevoer word:

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

Die resultaat van die uitvoer van die skripblok binne die hakies moet 'n Boolese waarde wees. As dit waar is ($true), sal die voorwerp wat ingevoer word na die Where-Object-cmdlet langs die pyplyn gestuur word, anders ($false) sal dit uitgevee word. Kom ons vertoon byvoorbeeld 'n lys van gestopte Windows Server-dienste, d.w.s. diegene wie se Status-eienskap op "Gestop" gestel is:

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

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Hier sien ons weer 'n tekstuele voorstelling, maar as jy die tipe en interne struktuur van die voorwerpe wat deur die pyplyn gaan, wil verstaan, is dit nie moeilik nie:

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

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Sorteer voorwerpe

Wanneer pyplyn verwerking van voorwerpe, is daar dikwels 'n behoefte om hulle te sorteer. Die Sort-Object-cmdlet word die name van eienskappe (sorteersleutels) deurgegee en gee voorwerpe wat volgens hul waardes gerangskik is terug. Dit is maklik om die uitset van lopende prosesse te sorteer volgens SVE-tyd bestee (spu-eienskap):

Get-Process | Sort-Object –Property cpu

Die -Property parameter kan weggelaat word wanneer die Sort-Object cmdlet geroep word; dit word by verstek gebruik. Vir omgekeerde sortering, gebruik die -Descending parameter:

Get-Process | Sort-Object cpu -Descending

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Seleksie van voorwerpe en hul dele

Die Select-Object-cmdlet laat jou toe om 'n spesifieke aantal voorwerpe aan die begin of einde van 'n pyplyn te kies deur die -First of -Last parameters te gebruik. Met sy hulp kan jy enkele voorwerpe of sekere eienskappe kies, en ook nuwe voorwerpe op grond daarvan skep. Kom ons kyk na hoe die cmdlet werk deur eenvoudige voorbeelde te gebruik.

Die volgende opdrag vertoon inligting oor die 10 prosesse wat die maksimum hoeveelheid RAM verbruik (WS-eienskap):

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

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

U kan slegs sekere eienskappe van voorwerpe wat deur die pyplyn gaan, kies en nuwes op grond daarvan skep:

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

As gevolg van die pyplyn se werking, sal ons 'n nuwe voorwerp ontvang, waarvan die struktuur sal verskil van die struktuur wat deur die Get-Process cmdlet teruggestuur word. Kom ons verifieer dit met Get-Lid:

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

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Let daarop dat Select-Object 'n enkele voorwerp (-Eerste 1) terugstuur wat slegs twee van die velde het wat ons gespesifiseer het: hul waardes is gekopieer vanaf die eerste voorwerp wat deur die Get-Process cmdlet na die pyplyn gestuur is. Een van die maniere om voorwerpe in PowerShell-skrifte te skep, is gebaseer op die gebruik van Select-Object:

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

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Deur Kies-Object te gebruik, kan jy berekende eienskappe by voorwerpe voeg wat as voorgestel moet word hash-tabelle. In hierdie geval stem die waarde van sy eerste sleutel ooreen met die eiendomsnaam, en die waarde van die tweede sleutel stem ooreen met die eiendomswaarde vir die huidige pyplynelement:

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

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Kom ons kyk na die struktuur van voorwerpe wat deur die vervoerband gaan:

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

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Vir Elke-Object, Groep-Object en Meet-Object

Daar is ander cmdlets om met voorwerpe te werk. As 'n voorbeeld, kom ons praat oor die drie mees bruikbare:

Vir elke voorwerp laat jou toe om PowerShell-kode vir elke voorwerp in die pyplyn uit te voer:

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

Groep-voorwerp groepeer voorwerpe volgens eiendomswaarde:

Group-Object PropertyName

As jy dit met die -NoElement-parameter laat loop, kan jy die aantal elemente in die groepe uitvind.

Maat-voorwerp versamel verskeie opsommingsparameters deur objekveldwaardes in die pyplyn (bereken die som, en vind ook die minimum, maksimum of gemiddelde waarde):

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

Tipies word die cmdlets wat bespreek word, interaktief gebruik en word dikwels in skrifte geskep. funksies met Begin-, Proses- en Eindblokke.

Skep .NET- en COM-voorwerpe (New-Object)

Daar is baie sagtewarekomponente met .NET Core- en COM-koppelvlakke wat nuttig is vir stelseladministrateurs. Deur die System.Diagnostics.EventLog-klas te gebruik, kan jy stelsellogboeke direk vanaf Windows PowerShell bestuur. Kom ons kyk na 'n voorbeeld van die skep van 'n instansie van hierdie klas deur die New-Object cmdlet met die -TypeName parameter te gebruik:

New-Object -TypeName System.Diagnostics.EventLog

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Aangesien ons nie 'n spesifieke gebeurtenislogboek gespesifiseer het nie, bevat die gevolglike geval van die klas geen data nie. Om dit te verander, moet jy 'n spesiale konstruktormetode oproep tydens die skepping daarvan met die -ArgumentList-parameter. As ons toegang tot die toepassingslogboek wil verkry, moet ons die string "Application" as 'n argument aan die konstruktor deurgee:

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

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Neem asseblief kennis dat ons die uitvoer van die opdrag in die $AppLog veranderlike gestoor het. Alhoewel pyplyne algemeen in interaktiewe modus gebruik word, vereis die skryf van skrifte dikwels die handhawing van 'n verwysing na 'n voorwerp. Daarbenewens is die kern .NET Core klasse vervat in die Stelsel naamruimte: PowerShell soek by verstek vir gespesifiseerde tipes daarin, so skryf Diagnostics.EventLog in plaas van System.Diagnostics.EventLog is heeltemal korrek.

Om met die log te werk, kan jy die toepaslike metodes gebruik:

$AppLog | Get-Member -MemberType Method

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Kom ons sê dit word skoongemaak deur die Clear() metode as daar toegangsregte is:

$AppLog.Clear()

Die New-Object-cmdlet word ook gebruik om met COM-komponente te werk. Daar is nogal baie van hulle - van die biblioteke wat saam met die Windows-skripbediener voorsien word tot ActiveX-toepassings, soos Internet Explorer. Om 'n COM-objek te skep, moet jy die -ComObject-parameter stel met die programmatiese ProgId van die verlangde klas:

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

Om jou eie voorwerpe met 'n arbitrêre struktuur te skep, lyk die gebruik van New-Object te argaïes en omslagtig; hierdie cmdlet word gebruik om met sagtewarekomponente buite PowerShell te werk. In toekomstige artikels sal hierdie kwessie in meer besonderhede bespreek word. Benewens .NET- en COM-objekte, sal ons ook CIM (WMI) en ADSI-objekte verken.

Oproep van statiese metodes

Sommige .NET Core-klasse kan nie geïnstansieer word nie, insluitend System.Environment en System.Math. Hulle is staties en bevat slegs statiese eienskappe en metodes. Dit is in wese verwysingsbiblioteke wat gebruik word sonder om voorwerpe te skep. Jy kan verwys na 'n statiese klas deur middel van 'n letterlike deur die tipe naam tussen vierkantige hakies in te sluit. As ons egter na die struktuur van die objek kyk deur Get-Lid te gebruik, sal ons die tipe System.RuntimeType in plaas van System.Environment sien:

[System.Environment] | Get-Member

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Om slegs statiese lede te sien, bel Get-Lid met die -Static parameter (let op die objektipe):

[System.Environment] | Get-Member -Static

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Om toegang tot statiese eienskappe en metodes te kry, gebruik twee opeenvolgende dubbelpunte in plaas van 'n punt na die letterlike:

[System.Environment]::OSVersion

Of

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

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Tik PSCustomObject

Onder die talle datatipes wat in PowerShell beskikbaar is, is dit die moeite werd om PSCustomObject te noem, ontwerp vir die stoor van voorwerpe met 'n arbitrêre struktuur. Die skep van so 'n voorwerp met die New-Object cmdlet word beskou as 'n klassieke, maar omslagtige en verouderde manier:

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

Kom ons kyk na die struktuur van die voorwerp:

$object | Get-Member

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Vanaf PowerShell 3.0 is 'n ander sintaksis beskikbaar:

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

U kan toegang tot die data verkry op een van die ekwivalente maniere:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Hier is 'n voorbeeld van die omskakeling van 'n bestaande hashable na 'n voorwerp:

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

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Een van die nadele van voorwerpe van hierdie tipe is dat die volgorde van hul eienskappe kan verander. Om dit te vermy, moet jy die [bestel] kenmerk gebruik:

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

Daar is ander opsies om 'n voorwerp te skep: hierbo het ons gekyk na die gebruik van die cmdlet Kies Objek. Al wat oorbly, is om uit te vind om elemente by te voeg en te verwyder. Om dit te doen vir die voorwerp van die vorige voorbeeld is redelik eenvoudig:

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

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Die Add-Member cmdlet laat jou toe om nie net eienskappe, maar ook metodes by 'n voorheen geskepte $objek by te voeg deur die "-MemberType ScriptMethod"-konstruksie te gebruik:

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

Neem asseblief kennis dat ons die $ScriptBlock-veranderlike van tipe ScriptBlock gebruik het om die kode vir die nuwe metode te stoor.

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Om eiendomme te verwyder, gebruik die ooreenstemmende metode:

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

Skep jou eie klasse

PowerShell 5.0 het die vermoë om te definieer bekendgestel klasse gebruik van sintaksis kenmerkend van objekgeoriënteerde programmeertale. Die dienswoord Klas is hiervoor bedoel, waarna jy die naam van die klas moet spesifiseer en sy liggaam tussen operateurhakies moet beskryf:

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

Dit is 'n ware .NET Core tipe, met 'n liggaam wat sy eienskappe, metodes en ander elemente beskryf. Kom ons kyk na 'n voorbeeld van die definisie van die eenvoudigste klas:

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

Om 'n objek (klasinstansie) te skep, gebruik die cmdlet Nuwe-voorwerp, of 'n letterlike tipe [MyClass] en pseudostatiese metode nuut (verstekkonstruktor):

$object = New-Object -TypeName MyClass

of

$object = [MyClass]::new()

Kom ons ontleed die struktuur van die voorwerp:

$object | Get-Member

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Moenie van omvang vergeet nie: jy kan nie na 'n tipenaam as 'n string verwys of 'n letterlike tipe buite die skrif of module waarin die klas gedefinieer is, gebruik nie. In hierdie geval kan funksies klasgevalle (objekte) terugstuur wat buite die module of skrif toeganklik sal wees.

Nadat u die voorwerp geskep het, vul sy eienskappe in:

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

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Let daarop dat die klasbeskrywing nie net die eiendomstipes spesifiseer nie, maar ook hul verstekwaardes:

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

Die beskrywing van 'n klasmetode lyk soos die beskrywing van 'n funksie, maar sonder om die funksiewoord te gebruik. Soos in 'n funksie, word parameters aan metodes oorgedra indien nodig:

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

Nou kan die verteenwoordiger van ons klas glimlag:

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

Metodes kan oorlaai word; daarbenewens het 'n klas statiese eienskappe en metodes, sowel as konstrukteurs wie se name saamval met die naam van die klas self. 'n Klas wat in 'n skrif of PowerShell-module gedefinieer word, kan as basis vir 'n ander dien - dit is hoe oorerwing geïmplementeer word. In hierdie geval word dit toegelaat om bestaande .NET-klasse as basisklasse te gebruik:

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

Ons beskrywing van werk met voorwerpe in PowerShell is skaars volledig. In die volgende publikasies sal ons probeer om dit te verdiep met praktiese voorbeelde: die vyfde artikel in die reeks sal gewy word aan die kwessies van die integrasie van PowerShell met derdeparty sagteware komponente. Vorige dele kan gevind word by die skakels hieronder.

Deel 1: Basiese Windows PowerShell-kenmerke
Deel 2: Inleiding tot die Windows PowerShell-programmeertaal
Deel 3: gee parameters na skrifte en funksies deur, skep cmdlets

Wat is Windows PowerShell en waarvoor word dit gebruik? Deel 4: Werk met voorwerpe, eie klasse

Bron: will.com

Voeg 'n opmerking