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 lai strādātu ar objektiem: cmdlet un funkcijas tos saņem kā ievadi un , 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
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ī (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 veikt 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:

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 
Š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"} 
Š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 
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 cpuParametru -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 
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 
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 1Cauruļ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 
Ņ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() 
Izmantojot opciju Select-Object, varat pievienot aprēķinātos rekvizītus objektiem, kas ir jāattēlo kā . Š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}} 
Apskatīsim objektu struktūru, kas iet caur konveijeru:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member 
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 PropertyNameJa 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 -SumParasti 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 
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 
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 
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.FileSystemObjectLai 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 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 
Lai skatītu tikai statiskos dalībniekus, izsauciet Get-Member ar parametru -Static (ņemiet vērā objekta veidu):
[System.Environment] | Get-Member -Static 
Lai piekļūtu statiskām īpašībām un metodēm, izmantojiet divus secīgus kolus, nevis punktu pēc burta:
[System.Environment]::OSVersionVai
$test=[System.Math]::Sqrt(25)
$test
$test.GetType() 
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 
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()

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 . 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

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.

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 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 , vai burtu tipa [MyClass] un jauns (noklusējuma konstruktors):
$object = New-Object -TypeName MyClassvai
$object = [MyClass]::new()Analizēsim objekta struktūru:
$object | Get-Member 
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

Ņ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 , 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.
Avots: www.habr.com
