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
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ī
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 { блок сценария }
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"}
Š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 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
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 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
Ņ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ā
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 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.
.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
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()
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
[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]::OSVersion
Vai
$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
$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
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
$object = New-Object -TypeName MyClass
vai
$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
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