Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Komandu teksta izvade PowerShell tulka logā ir tikai veids, kā parādīt informāciju cilvēka uztverei piemērotā formā. Patiesībā trešdiena orientēts lai strādātu ar objektiem: cmdlet un funkcijas tos saņem kā ievadi un atgriezās pie izejas, un interaktīvi un skriptos pieejamie mainīgo veidi ir balstīti uz .NET klasēm. Sērijas ceturtajā rakstā mēs sīkāk pētīsim darbu ar objektiem.

Satura rādītājs:

Objekti programmā PowerShell
Objektu struktūras apskate
Objektu filtrēšana
Objektu šķirošana
Objektu un to daļu izvēle
Katram objektam, grupai objektam un pasākumam objektam
.NET un COM objektu izveide (New-Object)
Statisko metožu izsaukšana
Ierakstiet PSCustomObject
Savu nodarbību izveide

Objekti programmā PowerShell

Atgādināsim, ka objekts ir datu lauku (īpašību, notikumu utt.) un to apstrādes metožu (metožu) kopums. Tās struktūru nosaka tips, kas parasti ir balstīts uz klasēm, kas tiek izmantotas vienotajā .NET Core platformā. Ir iespējams strādāt arī ar COM, CIM (WMI) un ADSI objektiem. Lai veiktu dažādas darbības ar datiem, ir nepieciešami rekvizīti un metodes; turklāt programmā PowerShell objektus var nodot kā argumentus funkcijām un cmdlet, piešķirt to vērtības mainīgajiem, kā arī komandu sastāva mehānisms (konveijers vai cauruļvads). Katra komanda konveijerā nodod savu izvadi nākamajai pēc kārtas, objektu pēc objekta. Apstrādei varat izmantot apkopotas cmdlet vai izveidot savu uzlabotas funkcijasveikt dažādas manipulācijas ar objektiem cauruļvadā: filtrēt, kārtot, grupēt un pat mainīt to struktūru. Datu pārsūtīšanai šajā formā ir nopietna priekšrocība: saņēmējai komandai nav jāparsē baitu straume (teksts), visa nepieciešamā informācija ir viegli izgūstama, izsaucot atbilstošos rekvizītus un metodes.

Objektu struktūras apskate

Piemēram, palaidīsim cmdlet Get-Process, kas ļauj iegūt informāciju par sistēmā strādājošajiem procesiem:

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Tas parādīs dažus formatētus teksta datus, kas nesniedz nekādu priekšstatu par atgriezto objektu īpašībām un to metodēm. Lai precīzi noregulētu izvadi, mums jāiemācās pārbaudīt objektu struktūru, un Get-Member cmdlet mums palīdzēs:

Get-Process | Get-Member

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Šeit mēs jau redzam veidu un struktūru, un ar papildu parametru palīdzību varam, piemēram, parādīt tikai ievadē iekļautā objekta īpašības:

Get-Process | Get-Member -MemberType Property

Šīs zināšanas būs nepieciešamas, lai interaktīvi risinātu administrēšanas problēmas vai rakstītu savus skriptus: piemēram, lai iegūtu informāciju par piekārtiem procesiem, izmantojot rekvizītu Responding.

Objektu filtrēšana

PowerShell ļauj objektus, kas atbilst noteiktam nosacījumam, izvadīt caur cauruļvadu:

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

Iekavās esošā skripta bloka izpildes rezultātam ir jābūt Būla vērtībai. Ja tā ir patiesa ($true), objekts, kas tiek ievadīts cmdlet Kur-Object, tiks nodots pa konveijeru, pretējā gadījumā ($false) tas tiks dzēsts. Piemēram, parādīsim apturēto Windows Server pakalpojumu sarakstu, t.i. tie, kuru statusa rekvizīts ir iestatīts uz “Apturēts”:

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

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Šeit atkal redzams teksta attēlojums, taču, ja vēlaties izprast caur cauruļvadu ejošo objektu veidu un iekšējo struktūru, tas nav grūti:

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

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Objektu šķirošana

Veicot objektu apstrādi cauruļvadā, bieži rodas nepieciešamība tos sakārtot. Cmdlet Sort-Object tiek nodoti rekvizītu nosaukumi (šķirošanas atslēgas) un atgriež objektus, kas sakārtoti pēc to vērtībām. Darbojošo procesu izvadi ir viegli kārtot pēc CPU patērētā laika (CPU rekvizīts):

Get-Process | Sort-Object –Property cpu

Parametru -Property var izlaist, izsaucot cmdlet Sort-Object; tas tiek izmantots pēc noklusējuma. Apgrieztai kārtošanai izmantojiet parametru -Dilstoši:

Get-Process | Sort-Object cpu -Descending

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Objektu un to daļu izvēle

Cmdlet Select-Object ļauj atlasīt noteiktu skaitu objektu konveijera sākumā vai beigās, izmantojot parametrus -First vai -Last. Ar tās palīdzību jūs varat atlasīt atsevišķus objektus vai noteiktus rekvizītus, kā arī izveidot jaunus objektus, pamatojoties uz tiem. Apskatīsim, kā darbojas cmdlet, izmantojot vienkāršus piemērus.

Šī komanda parāda informāciju par 10 procesiem, kas patērē maksimālo RAM daudzumu (WS rekvizīts):

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

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Varat atlasīt tikai noteiktus objektu rekvizītus, kas iet cauri cauruļvadam, un izveidot jaunus, pamatojoties uz tiem:

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

Cauruļvada darbības rezultātā mēs saņemsim jaunu objektu, kura struktūra atšķirsies no Get-Process cmdlet atgrieztās struktūras. Pārbaudīsim to, izmantojot Get-Member:

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

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Ņemiet vērā, ka Select-Object atgriež vienu objektu (-First 1), kuram ir tikai divi no mūsu norādītajiem laukiem: to vērtības tika kopētas no pirmā objekta, ko Get-Process cmdlet nodeva konveijerā. Viens no veidiem, kā izveidot objektus PowerShell skriptos, ir balstīts uz Select-Object izmantošanu:

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

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Izmantojot opciju Select-Object, varat pievienot aprēķinātos rekvizītus objektiem, kas ir jāattēlo kā hash tabulas. Šajā gadījumā tās pirmās atslēgas vērtība atbilst rekvizīta nosaukumam, bet otrās atslēgas vērtība atbilst pašreizējā konveijera elementa rekvizīta vērtībai:

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

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Apskatīsim objektu struktūru, kas iet caur konveijeru:

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

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Katram objektam, grupai objektam un pasākumam objektam

Ir arī citas cmdlet darbam ar objektiem. Piemēram, parunāsim par trim visnoderīgākajiem:

Katram objektam ļauj palaist PowerShell kodu katram konveijera objektam:

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

Grupa-Objekts grupē objektus pēc īpašuma vērtības:

Group-Object PropertyName

Ja palaižat to ar parametru -NoElement, varat uzzināt elementu skaitu grupās.

Mērījums-Objekts apkopo dažādus kopsavilkuma parametrus pēc objekta lauka vērtībām cauruļvadā (aprēķina summu, kā arī atrod minimālo, maksimālo vai vidējo vērtību):

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

Parasti apspriestās cmdlet tiek izmantotas interaktīvi un bieži tiek veidotas skriptos. функции ar sākuma, procesa un beigu blokiem.

.NET un COM objektu izveide (New-Object)

Ir daudz programmatūras komponentu ar .NET Core un COM saskarnēm, kas ir noderīgi sistēmas administratoriem. Izmantojot System.Diagnostics.EventLog klasi, varat pārvaldīt sistēmas žurnālus tieši no Windows PowerShell. Apskatīsim piemēru šīs klases gadījuma izveidei, izmantojot cmdlet New-Object ar parametru -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Tā kā mēs nenorādījām konkrētu notikumu žurnālu, iegūtajā klases instancē nav datu. Lai to mainītu, tās izveides laikā ir jāizsauc īpaša konstruktora metode, izmantojot parametru -ArgumentList. Ja mēs vēlamies piekļūt lietojumprogrammu žurnālam, mums ir jānodod virkne "Application" kā arguments konstruktoram:

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

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Lūdzu, ņemiet vērā, ka komandas izvadi saglabājām mainīgajā $AppLog. Lai gan konveijerus parasti izmanto interaktīvā režīmā, skriptu rakstīšanai bieži ir jāsaglabā atsauce uz objektu. Turklāt galvenās .NET Core klases ir ietvertas sistēmas nosaukumvietā: PowerShell pēc noklusējuma tajā meklē noteiktus veidus, tāpēc Diagnostics.EventLog rakstīšana System.Diagnostics.EventLog vietā ir diezgan pareiza.

Lai strādātu ar žurnālu, varat izmantot atbilstošās metodes:

$AppLog | Get-Member -MemberType Method

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Pieņemsim, ka tas tiek notīrīts ar Clear() metodi, ja ir piekļuves tiesības:

$AppLog.Clear()

Jaunā objekta cmdlet tiek izmantots arī darbam ar COM komponentiem. To ir diezgan daudz - no bibliotēkām, kas tiek piegādātas kopā ar Windows skriptu serveri, līdz ActiveX lietojumprogrammām, piemēram, Internet Explorer. Lai izveidotu COM objektu, jums jāiestata parametrs -ComObject ar vajadzīgās klases programmatisko ProgId:

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

Lai izveidotu savus objektus ar patvaļīgu struktūru, New-Object izmantošana šķiet pārāk arhaiska un apgrūtinoša; šī cmdlet tiek izmantota, lai strādātu ar programmatūras komponentiem, kas ir ārpus PowerShell. Nākamajos rakstos šis jautājums tiks apspriests sīkāk. Papildus .NET un COM objektiem mēs izpētīsim arī CIM (WMI) un ADSI objektus.

Statisko metožu izsaukšana

Dažas .NET Core klases nevar izveidot, tostarp System.Environment un System.Math. Viņi ir statisks un satur tikai statiskas īpašības un metodes. Tās būtībā ir atsauces bibliotēkas, kuras tiek izmantotas, neradot objektus. Jūs varat atsaukties uz statisku klasi, izmantojot burtu, iekļaujot tipa nosaukumu kvadrātiekavās. Tomēr, ja aplūkosim objekta struktūru, izmantojot Get-Member, mēs redzēsim veidu System.RuntimeType, nevis System.Environment:

[System.Environment] | Get-Member

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Lai skatītu tikai statiskos dalībniekus, izsauciet Get-Member ar parametru -Static (ņemiet vērā objekta veidu):

[System.Environment] | Get-Member -Static

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Lai piekļūtu statiskām īpašībām un metodēm, izmantojiet divus secīgus kolus, nevis punktu pēc burta:

[System.Environment]::OSVersion

Vai

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

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Ierakstiet PSCustomObject

Starp daudzajiem PowerShell pieejamajiem datu veidiem ir vērts pieminēt PSCustomObject, kas paredzēts objektu glabāšanai ar patvaļīgu struktūru. Šāda objekta izveide, izmantojot cmdlet New-Object, tiek uzskatīta par klasisku, taču apgrūtinošu un novecojušu veidu:

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

Apskatīsim objekta struktūru:

$object | Get-Member

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Sākot ar PowerShell 3.0, ir pieejama cita sintakse:

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

Varat piekļūt datiem vienā no līdzvērtīgiem veidiem:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Tālāk ir sniegts piemērs esošas hashtable konvertēšanai par objektu:

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

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Viens no šāda veida objektu trūkumiem ir tas, ka var mainīties to īpašību secība. Lai no tā izvairītos, jums ir jāizmanto atribūts [ordered]:

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

Ir arī citas objekta izveides iespējas: iepriekš mēs apskatījām cmdlet izmantošanu Select-Object. Atliek tikai izdomāt, kā pievienot un noņemt elementus. To izdarīt objektam no iepriekšējā piemēra ir pavisam vienkārši:

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

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Cmdlet Add-Member ļauj iepriekš izveidotajam $objektam pievienot ne tikai rekvizītus, bet arī metodes, izmantojot konstrukciju "-MemberType ScriptMethod":

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

Lūdzu, ņemiet vērā, ka jaunās metodes koda saglabāšanai mēs izmantojām ScriptBlock tipa mainīgo $ScriptBlock.

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Lai noņemtu rekvizītus, izmantojiet atbilstošo metodi:

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

Savu nodarbību izveide

PowerShell 5.0 ieviesa iespēju definēt pakāpes izmantojot objektorientētām programmēšanas valodām raksturīgo sintaksi. Tam ir paredzēts pakalpojuma vārds Class, pēc kura jānorāda klases nosaukums un operatora iekavās jāapraksta tās pamatteksts:

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

Šis ir īsts .NET Core tips, kura pamatteksts apraksta tā īpašības, metodes un citus elementus. Apskatīsim vienkāršākās klases definēšanas piemēru:

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

Lai izveidotu objektu (klases gadījumu), izmantojiet cmdlet Jauns objekts, vai burtu tipa [MyClass] un pseidostatiskā metode jauns (noklusējuma konstruktors):

$object = New-Object -TypeName MyClass

vai

$object = [MyClass]::new()

Analizēsim objekta struktūru:

$object | Get-Member

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Neaizmirstiet par tvērumu: jūs nevarat atsaukties uz tipa nosaukumu kā virkni vai izmantot tipa literālu ārpus skripta vai moduļa, kurā ir definēta klase. Šajā gadījumā funkcijas var atgriezt klases gadījumus (objektus), kas būs pieejami ārpus moduļa vai skripta.

Pēc objekta izveidošanas aizpildiet tā rekvizītus:

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

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Ņemiet vērā, ka klases aprakstā ir norādīti ne tikai rekvizītu veidi, bet arī to noklusējuma vērtības:

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

Klases metodes apraksts atgādina funkcijas aprakstu, taču neizmanto funkcijas vārdu. Tāpat kā funkcijā, vajadzības gadījumā parametri tiek nodoti metodēm:

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

Tagad mūsu klases pārstāvis var pasmaidīt:

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

Metodes var būt pārslogotas, turklāt klasei ir statiskās īpašības un metodes, kā arī konstruktori, kuru nosaukumi sakrīt ar pašas klases nosaukumu. Klase, kas definēta skriptā vai PowerShell modulī, var kalpot par bāzi citai – šādi tiek īstenota mantošana. Šajā gadījumā kā bāzes klases ir atļauts izmantot esošās .NET klases:

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

Mūsu apraksts par darbu ar objektiem programmā PowerShell nav izsmeļošs. Nākamajās publikācijās mēģināsim to padziļināt ar praktiskiem piemēriem: sērijas piektais raksts būs veltīts PowerShell integrēšanas ar trešo pušu programmatūras komponentiem jautājumiem. Iepriekšējās daļas var atrast zemāk esošajās saitēs.

1. daļa: Windows PowerShell pamata līdzekļi
2. daļa: Ievads Windows PowerShell programmēšanas valodā
3. daļa: parametru nodošana skriptiem un funkcijām, cmdlet izveide

Kas ir Windows PowerShell un kādam nolūkam to lieto? 4.daļa: Darbs ar objektiem, savas klases

Avots: www.habr.com

Pievieno komentāru