Kas ir Windows PowerShell un ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

Kas ir Windows PowerShell un ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

Š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 { блок сценария }

Результатом выполнения блока сценария в операторных скобках должно быть логические значение. Если оно истинно ($true) попавший на вход командлету Where-Object объект будет передан по конвейеру дальше, в противном случае (значение $false) он будет удален. Для примера выведем список остановленных служб Windows Server, т.е. таких, у которых свойство Status имеет значение «Stopped»:

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

Kas ir Windows PowerShell un ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

Š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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

Ņ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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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)

Есть множество программных компонентов с интерфейсами .NET Core и COM, которые пригодятся системным администраторам. С помощью класса System.Diagnostics.EventLog можно управлять системными журналами непосредственно из Windows PowerShell. Разберем пример создания экземпляра этого класса при помощи командлета New-Object с параметром -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Kas ir Windows PowerShell un ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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

$AppLog.Clear()

Командлет New-Object применяется и для работы с СОМ-компонентами. Их довольно много — от поставляемых с сервером сценариев Windows библиотек до приложений ActiveX, таких, например, как Internet Explorer. Чтобы создать СОМ-объект, требуется задать параметр -ComObject с программным идентификатора 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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

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 ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

Ņ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: основные возможности Windows PowerShell
Часть 2: введение в язык программирования Windows PowerShell
3. daļa: parametru nodošana skriptiem un funkcijām, cmdlet izveide

Kas ir Windows PowerShell un ko ar to ēst? 4. daļa: Darbs ar objektiem, pielāgotām klasēm

Avots: www.habr.com

Iegādājieties uzticamu mitināšanu vietnēm ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa vietņu mitināšanu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster