Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

La teksta eligo de komandoj en la PowerShell interpretisto fenestro estas nur maniero por montri informojn en formo taŭga por homa percepto. Fakte merkredon orientita labori kun objektoj: cmdletoj kaj funkcioj ricevas ilin kiel enigaĵon kaj revenis ĉe la elirejo, kaj la variaj tipoj disponeblaj interage kaj en skriptoj baziĝas sur .NET-klasoj. En la kvara artikolo de la serio, ni studos labori kun objektoj pli detale.

Enhavtabelo:

Objektoj en PowerShell
Vidante la strukturon de objektoj
Filtri objektojn
Ordigo de objektoj
Elektado de objektoj kaj iliaj partoj
PorĈiu-Objekto, Grupo-Objekto kaj Mezuro-Objekto
Kreante .NET kaj COM-objektojn (Nova-Objekto)
Voki Statikajn Metodojn
Tajpu PSCustomObject
Kreante Viajn Proprajn Klasojn

Objektoj en PowerShell

Ni rememoru, ke objekto estas kolekto de datumkampoj (propraĵoj, eventoj, ktp.) kaj metodoj por prilabori ilin (metodoj). Ĝia strukturo estas specifita per tipo, kiu kutime baziĝas sur klasoj uzataj en la unuigita .NET Core-platformo. Ankaŭ eblas labori kun objektoj COM, CIM (WMI) kaj ADSI. Propraĵoj kaj metodoj estas bezonataj por plenumi diversajn agojn pri datumoj; krome, en PowerShell, objektoj povas esti transdonitaj kiel argumentoj al funkcioj kaj cmdletoj, asignitaj siajn valorojn al variabloj, kaj ankaŭ ekzistas komanda kompona mekanismo (transportilo aŭ dukto). Ĉiu komando en la dukto pasas sian produktaĵon al la sekva laŭvice, objekto post objekto. Por prilaborado, vi povas uzi kompilitajn cmdletojn aŭ krei vian propran altnivelaj funkciojfari diversajn manipuladojn kun objektoj en la dukto: filtri, ordigi, grupigi kaj eĉ ŝanĝi ilian strukturon. Transsendi datumojn en ĉi tiu formo havas gravan avantaĝon: la ricevanta teamo ne bezonas analizi la bajtan fluon (tekston), ĉiuj necesaj informoj estas facile reakiritaj nomante la taŭgajn ecojn kaj metodojn.

Vidante la strukturon de objektoj

Ekzemple, ni rulu la cmdlet Get-Process, kiu ebligas al vi akiri informojn pri la procezoj kurantaj en la sistemo:

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Ĝi montros kelkajn formatitajn tekstajn datumojn, kiuj ne donas ideon pri la propraĵoj de la revenitaj objektoj kaj iliaj metodoj. Por agordi la eligon, ni devas lerni kiel ekzameni la strukturon de objektoj, kaj la cmdlet Get-Member helpos nin pri tio:

Get-Process | Get-Member

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Ĉi tie ni jam vidas la tipon kaj strukturon, kaj helpe de pliaj parametroj ni povas, ekzemple, montri nur la ecojn de la objekto inkluzivita en la enigo:

Get-Process | Get-Member -MemberType Property

Ĉi tiu scio estos bezonata por solvi administrajn problemojn interage aŭ por skribi viajn proprajn skriptojn: ekzemple, por akiri informojn pri penditaj procezoj uzante la Respondan posedaĵon.

Filtri objektojn

PowerShell permesas al objektoj kiuj renkontas certan kondiĉon esti pasitaj tra dukto:

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

La rezulto de ekzekuto de la skriptobloko ene de la krampoj devas esti bulea valoro. Se ĝi estas vera ($vera), la objekto kiu estas enigita al la cmdlet Where-Object estos pasita laŭ la dukto, alie ($false) ĝi estos forigita. Ekzemple, ni montru liston de haltigitaj Vindoza Servilo-servoj, t.e. tiuj, kies posedaĵo de Statuso estas agordita al "Haltigita":

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

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Ĉi tie denove ni vidas tekstan reprezenton, sed se vi volas kompreni la tipon kaj internan strukturon de la objektoj pasantaj tra la dukto, tio ne estas malfacila:

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

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Ordigo de objektoj

Kiam dukto prilaborado de objektoj, estas ofte bezono ordigi ilin. La cmdleto Sort-Object ricevas la nomojn de propraĵoj (ordigaj ŝlosiloj) kaj resendas objektojn ordonitajn laŭ iliaj valoroj. Estas facile ordigi la eliron de kurantaj procezoj laŭ CPU-tempo elspezita (cpu-posedaĵo):

Get-Process | Sort-Object –Property cpu

La parametro -Property povas esti preterlasita dum vokado de la cmdleto Sort-Object; ĝi estas uzata defaŭlte. Por inversa ordigo, uzu la -Descending parametron:

Get-Process | Sort-Object cpu -Descending

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Elektado de objektoj kaj iliaj partoj

La cmdleto Select-Object permesas elekti specifan nombron da objektoj ĉe la komenco aŭ fino de dukto per la -Unua aŭ -Lasta parametroj. Kun ĝia helpo, vi povas elekti unuopajn objektojn aŭ certajn ecojn, kaj ankaŭ krei novajn objektojn surbaze de ili. Ni rigardu kiel funkcias la cmdleto uzante simplajn ekzemplojn.

La sekva komando montras informojn pri la 10 procezoj konsumantaj la maksimuman kvanton da RAM (WS-posedaĵo):

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

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Vi povas elekti nur iujn ecojn de objektoj trairantaj la dukto kaj krei novajn bazitajn sur ili:

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

Kiel rezulto de la operacio de la dukto, ni ricevos novan objekton, kies strukturo diferencas de la strukturo redonita de la cmdlet Get-Process. Ni konfirmu ĉi tion uzante Get-Member:

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

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Notu, ke Elektu-Objekto resendas ununuran objekton (-Unua 1) kiu havas nur du el la kampoj, kiujn ni specifis: iliaj valoroj estis kopiitaj de la unua objekto transdonita en la dukto per la cmdlet Get-Process. Unu el la manieroj krei objektojn en PowerShell-skriptoj baziĝas sur uzado de Select-Object:

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

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Uzante Elektu-Objekton, vi povas aldoni komputitajn ecojn al objektoj, kiuj devas esti reprezentitaj kiel hashtabloj. En ĉi tiu kazo, la valoro de ĝia unua ŝlosilo respondas al la propra nomo, kaj la valoro de la dua ŝlosilo respondas al la proprietvaloro por la nuna duktoelemento:

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

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Ni rigardu la strukturon de objektoj pasantaj tra la transportilo:

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

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

PorĈiu-Objekto, Grupo-Objekto kaj Mezuro-Objekto

Estas aliaj cmdletoj por labori kun objektoj. Ekzemple, ni parolu pri la tri plej utilaj:

Por Ĉiu-Objekto permesas al vi ruli PowerShell-kodon por ĉiu objekto en la dukto:

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

Grupo-Objekto grupigas objektojn laŭ posedaĵvaloro:

Group-Object PropertyName

Se vi rulas ĝin per la parametro -NoElement, vi povas ekscii la nombron da elementoj en la grupoj.

Mezuro-Objekto agregas diversajn resumajn parametrojn per objektaj kampovaloroj en la dukto (kalkulas la sumon, kaj ankaŭ trovas la minimuman, maksimuman aŭ mezan valoron):

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

Tipe, la cmdletoj diskutitaj estas uzataj interage, kaj ofte estas kreitaj en skriptoj. funkcioj kun Komenco, Procezo kaj Finaj blokoj.

Kreante .NET kaj COM-objektojn (Nova-Objekto)

Estas multaj programaj komponantoj kun .NET Core kaj COM-interfacoj, kiuj estas utilaj al sistemaj administrantoj. Uzante la klason System.Diagnostics.EventLog, vi povas administri sistemajn protokolojn rekte de Windows PowerShell. Ni rigardu ekzemplon pri kreado de ekzemplo de ĉi tiu klaso uzante la cmdlet New-Object kun la parametro -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Ĉar ni ne specifis specifan okazaĵprotokolo, la rezulta okazo de la klaso enhavas neniujn datumojn. Por ŝanĝi ĉi tion, vi devas voki specialan konstruan metodon dum ĝia kreado uzante la parametron -ArgumentList. Se ni volas aliri la protokolon de aplikaĵo, ni devus pasi la ĉenon "Apliko" kiel argumenton al la konstrukciisto:

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

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Bonvolu noti, ke ni konservis la eligon de la komando en la variablo $AppLog. Kvankam duktoj estas ofte uzitaj en interaga reĝimo, skribi manuskriptojn ofte postulas konservi referencon al objekto. Aldone, la kernaj .NET Core-klasoj estas enhavitaj en la System-nomspaco: PowerShell defaŭlte serĉas specifitajn tipojn en ĝi, do skribi Diagnostics.EventLog anstataŭ System.Diagnostics.EventLog estas sufiĉe ĝusta.

Por labori kun la protokolo, vi povas uzi la taŭgajn metodojn:

$AppLog | Get-Member -MemberType Method

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Ni diru, ke ĝi estas forigita per la metodo Clear() se ekzistas alirrajtoj:

$AppLog.Clear()

La New-Object cmdleto ankaŭ estas uzata por labori kun COM-komponentoj. Estas sufiĉe multe da ili - de la bibliotekoj provizitaj per la Vindoza skriptservilo ĝis ActiveX-aplikoj, kiel Interreto Explorer. Por krei COM-objekton, vi devas agordi la parametron -ComObject kun la programa ProgId de la dezirata klaso:

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

Por krei viajn proprajn objektojn kun arbitra strukturo, uzi New-Object ŝajnas tro arkaika kaj maloportuna; ĉi tiu cmdlet estas uzata por labori kun programaraj komponantoj ekster PowerShell. En estontaj artikoloj ĉi tiu afero estos diskutita pli detale. Krom objektoj .NET kaj COM, ni ankaŭ esploros objektojn CIM (WMI) kaj ADSI.

Voki Statikajn Metodojn

Kelkaj .NET Kernaj klasoj ne povas esti instantiigitaj, inkluzive de System.Environment kaj System.Math. Ili estas statika kaj enhavas nur senmovajn ecojn kaj metodojn. Ĉi tiuj estas esence referencaj bibliotekoj, kiuj estas uzataj sen krei objektojn. Vi povas rilati al senmova klaso per laŭvorta enmetante la tipnomon inter kvadrataj krampoj. Tamen, se ni rigardas la strukturon de la objekto uzante Get-Member, ni vidos la tipon System.RuntimeType anstataŭ System.Environment:

[System.Environment] | Get-Member

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Por vidi nur senmovajn membrojn, voku Get-Member per la parametro -Static (notu la objektospecon):

[System.Environment] | Get-Member -Static

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Por aliri senmovajn trajtojn kaj metodojn, uzu du sinsekvajn dupunktojn anstataŭ punkto post la laŭvorta:

[System.Environment]::OSVersion

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

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Tajpu PSCustomObject

Inter la multaj datumtipoj disponeblaj en PowerShell, indas mencii PSCustomObject, desegnita por stoki objektojn kun arbitra strukturo. Krei tian objekton per la New-Object cmdlet estas konsiderata klasika, sed maloportuna kaj malmoderna maniero:

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

Ni rigardu la strukturon de la objekto:

$object | Get-Member

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Komencante kun PowerShell 3.0, alia sintakso estas disponebla:

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

Vi povas aliri la datumojn en unu el la ekvivalentaj manieroj:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Jen ekzemplo de konvertado de ekzistanta hashtablo al objekto:

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

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Unu el la malavantaĝoj de objektoj de ĉi tiu tipo estas ke la ordo de iliaj propraĵoj povas ŝanĝiĝi. Por eviti tion, vi devas uzi la [ordonita] atributon:

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

Estas aliaj ebloj por krei objekton: supre ni rigardis uzante la cmdleton Elektebla-Objekto. Restas nur eltrovi aldoni kaj forigi elementojn. Fari tion por la objekto de la antaŭa ekzemplo estas sufiĉe simpla:

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

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

La cmdleto Add-Member permesas aldoni ne nur trajtojn, sed ankaŭ metodojn al antaŭe kreita $objekto uzante la konstrukcion "-MemberType ScriptMethod":

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

Bonvolu noti, ke ni uzis la variablon $ScriptBlock de tipo ScriptBlock por konservi la kodon por la nova metodo.

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Por forigi ecojn, uzu la respondan metodon:

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

Kreante Viajn Proprajn Klasojn

PowerShell 5.0 enkondukis la kapablon difini klasoj uzante sintakson karakterizaĵon de objektemaj programlingvoj. La servovorto Klaso estas destinita por tio, post kio vi devus specifi la nomon de la klaso kaj priskribi ĝian korpon inter krampoj de operaciisto:

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

Ĉi tio estas vera .NET Core-tipo, kun korpo, kiu priskribas ĝiajn ecojn, metodojn kaj aliajn elementojn. Ni rigardu ekzemplon de difino de la plej simpla klaso:

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

Por krei objekton (klasan kazon), uzu la cmdleton Nova-Objekto, aŭ literalo de tipo [MiaKlaso] kaj pseudostatika metodo nova (defaŭlta konstrukciisto):

$object = New-Object -TypeName MyClass

$object = [MyClass]::new()

Ni analizu la strukturon de la objekto:

$object | Get-Member

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Ne forgesu pri amplekso: vi ne povas referenci al tipnomo kiel ĉeno aŭ uzi tipon laŭvorte ekster la skripto aŭ modulo en kiu la klaso estas difinita. En ĉi tiu kazo, funkcioj povas resendi klasokazojn (objektojn), kiuj estos alireblaj ekster la modulo aŭ skripto.

Post kreado de la objekto, plenigu ĝiajn ecojn:

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

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

Notu, ke la klaspriskribo specifas ne nur la posedaĵtipojn, sed ankaŭ iliajn defaŭltajn valorojn:

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

La priskribo de klasmetodo similas la priskribon de funkcio, sed sen uzi la funkciovorton. Kiel en funkcio, parametroj estas pasigitaj al metodoj se necese:

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

Nun la reprezentanto de nia klaso povas rideti:

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

Metodoj povas esti troŝarĝitaj; krome, klaso havas statikaj propraĵoj kaj metodoj, same kiel konstrukciistoj kies nomoj koincidas kun la nomo de la klaso mem. Klaso difinita en skripto aŭ PowerShell-modulo povas servi kiel bazo por alia - jen kiel heredo estas efektivigita. En ĉi tiu kazo, estas permesite uzi ekzistantajn .NET-klasojn kiel bazajn:

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

Nia priskribo pri laboro kun objektoj en PowerShell estas apenaŭ ĝisfunda. En la sekvaj publikaĵoj, ni provos profundigi ĝin per praktikaj ekzemploj: la kvina artikolo en la serio estos dediĉita al la aferoj de integriĝo de PowerShell kun triaj programaraj komponantoj. Pasintaj partoj troveblas ĉe la subaj ligiloj.

Parto 1: Bazaj Vindozaj PowerShell Trajtoj
Parto 2: Enkonduko al la Vindoza PowerShell Programlingvo
Parto 3: pasante parametrojn al skriptoj kaj funkcioj, kreante cmdletojn

Kio estas Windows PowerShell kaj por kio ĝi estas uzata? Parto 4: Laborante kun objektoj, propraj klasoj

fonto: www.habr.com

Aldoni komenton