Komandų tekstinė išvestis PowerShell interpretatoriaus lange yra tik būdas parodyti informaciją žmogaus suvokimui tinkama forma. Tiesą sakant, trečiadienį
Turinys:
Objektai PowerShell
Prisiminkime, kad objektas yra duomenų laukų (ypatybių, įvykių ir kt.) ir jų apdorojimo metodų (metodų) rinkinys. Jos struktūrą nurodo tipas, kuris dažniausiai grindžiamas klasėmis, naudojamomis vieningoje .NET Core platformoje. Taip pat galima dirbti su COM, CIM (WMI) ir ADSI objektais. Ypatybės ir metodai reikalingi norint atlikti įvairius veiksmus su duomenimis; be to, PowerShell, objektai gali būti perduodami kaip argumentai funkcijoms ir cmdlet, priskirtos jų reikšmės kintamiesiems, taip pat yra
Objektų struktūros peržiūra
Pavyzdžiui, paleiskite Get-Process cmdlet, kuri leidžia gauti informacijos apie sistemoje veikiančius procesus:
Bus rodomi kai kurie suformatuoti tekstiniai duomenys, kurie nesuteikia jokio supratimo apie grąžinamų objektų savybes ir jų metodus. Norėdami tiksliai sureguliuoti išvestį, turime išmokti ištirti objektų struktūrą, o cmdlet Get-Member padės mums tai padaryti:
Get-Process | Get-Member
Čia jau matome tipą ir struktūrą, o papildomų parametrų pagalba galime, pavyzdžiui, rodyti tik į įvestį įtraukto objekto savybes:
Get-Process | Get-Member -MemberType Property
Šių žinių prireiks norint interaktyviai spręsti administravimo problemas arba rašyti savo scenarijus: pavyzdžiui, norint gauti informacijos apie pakabintus procesus naudojant savybę Responding.
Objektų filtravimas
„PowerShell“ leidžia tam tikrą sąlygą atitinkančius objektus perduoti vamzdynu:
Where-Object { блок сценария }
Scenarijaus bloko skliausteliuose vykdymo rezultatas turi būti loginė reikšmė. Jei teisinga ($true), objektas, įvestas į cmdlet Kur-Object, bus perduotas konvejeriu, priešingu atveju ($false) jis bus ištrintas. Pavyzdžiui, parodykime sustabdytų Windows Server paslaugų sąrašą, t.y. tie, kurių būsenos ypatybė nustatyta į „Sustabdyta“:
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Čia vėl matome tekstinį vaizdą, bet jei norite suprasti objektų, einančių per dujotiekį, tipą ir vidinę struktūrą, tai nėra sunku:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Objektų rūšiavimas
Apdorojant objektus vamzdynu, dažnai reikia juos rūšiuoti. „Sort-Object“ cmdlet perduodami ypatybių pavadinimai (rūšiavimo raktai) ir pateikiami objektai, išdėstyti pagal jų reikšmes. Nesunku rūšiuoti vykdomų procesų išvestį pagal praleistą procesoriaus laiką (procesoriaus savybę):
Get-Process | Sort-Object –Property cpu
Parametras -Property gali būti praleistas iškviečiant cmdlet Sort-Object; jis naudojamas pagal numatytuosius nustatymus. Jei norite rūšiuoti atvirkštiniu būdu, naudokite parametrą -Descending:
Get-Process | Sort-Object cpu -Descending
Objektų ir jų dalių pasirinkimas
„Select-Object“ cmdlet leidžia pasirinkti tam tikrą objektų skaičių konvejerio pradžioje arba pabaigoje naudojant parametrus -First arba -Last. Su jo pagalba galite pasirinkti pavienius objektus ar tam tikras savybes, taip pat pagal juos kurti naujus objektus. Pažiūrėkime, kaip veikia cmdlet, naudodami paprastus pavyzdžius.
Ši komanda rodo informaciją apie 10 procesų, sunaudojančių didžiausią RAM kiekį (WS savybė):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Galite pasirinkti tik tam tikras konvejeriu einančių objektų ypatybes ir pagal jas kurti naujas:
Get-Process | Select-Object ProcessName, Id -First 1
Dėl dujotiekio veikimo gausime naują objektą, kurio struktūra skirsis nuo Get-Process cmdlet grąžintos struktūros. Patikrinkite tai naudodami Get-Member:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Atminkite, kad „Select-Object“ grąžina vieną objektą (-First 1), kuriame yra tik du mūsų nurodyti laukai: jų reikšmės buvo nukopijuotos iš pirmojo objekto, kurį į konvejerį perdavė Get-Process cmdlet. Vienas iš būdų, kaip sukurti objektus PowerShell scenarijuose, yra pagrįstas pasirinkimo objekto naudojimu:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
Naudodami „Select-Object“ galite pridėti apskaičiuotas ypatybes prie objektų, kurie turi būti pavaizduoti kaip
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Pažvelkime į objektų, einančių per konvejerį, struktūrą:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
Kiekvienam objektui, grupei objektui ir priemonei objektui
Yra ir kitų cmdlet, skirtų darbui su objektais. Pavyzdžiui, pakalbėkime apie tris naudingiausius:
„ForEach-Object“ leidžia paleisti „PowerShell“ kodą kiekvienam dujotiekio objektui:
ForEach-Object { блок сценария }
Grupė-objektas sugrupuoja objektus pagal nuosavybės vertę:
Group-Object PropertyName
Jei paleisite jį naudodami parametrą -NoElement, galite sužinoti elementų skaičių grupėse.
Matas-Objektas apibendrina įvairius apibendrintus parametrus pagal objekto lauko reikšmes konvejeryje (apskaičiuoja sumą, taip pat suranda mažiausią, didžiausią ar vidutinę reikšmę):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Paprastai aptariamos cmdlet naudojamos interaktyviai ir dažnai kuriamos scenarijuose.
NET ir COM objektų kūrimas (New-Object)
Yra daug programinės įrangos komponentų su .NET Core ir COM sąsajomis, kurios yra naudingos sistemos administratoriams. Naudodami System.Diagnostics.EventLog klasę galite tvarkyti sistemos žurnalus tiesiai iš Windows PowerShell. Pažvelkime į šios klasės egzemplioriaus kūrimo pavyzdį naudojant cmdlet New-Object su parametru -TypeName:
New-Object -TypeName System.Diagnostics.EventLog
Kadangi nenurodėme konkretaus įvykių žurnalo, gautame klasės egzemplioriuje nėra duomenų. Norėdami tai pakeisti, jo kūrimo metu turite iškviesti specialų konstruktoriaus metodą naudodami parametrą -ArgumentList. Jei norime pasiekti programos žurnalą, kaip argumentą konstruktoriui turėtume perduoti eilutę „Application“:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Atkreipkite dėmesį, kad komandos išvestį išsaugojome $AppLog kintamajame. Nors vamzdynai dažniausiai naudojami interaktyviuoju režimu, rašant scenarijus dažnai reikia išlaikyti nuorodą į objektą. Be to, pagrindinės .NET Core klasės yra sistemos vardų erdvėje: PowerShell pagal numatytuosius nustatymus joje ieško nurodytų tipų, todėl rašyti Diagnostics.EventLog vietoj System.Diagnostics.EventLog yra gana teisinga.
Norėdami dirbti su žurnalu, galite naudoti atitinkamus metodus:
$AppLog | Get-Member -MemberType Method
Tarkime, kad jis išvalomas naudojant Clear() metodą, jei yra prieigos teisės:
$AppLog.Clear()
„New-Object“ cmdlet taip pat naudojama darbui su COM komponentais. Jų yra gana daug – nuo bibliotekų, tiekiamų su „Windows“ scenarijų serveriu, iki „ActiveX“ programų, tokių kaip „Internet Explorer“. Norėdami sukurti COM objektą, turite nustatyti parametrą -ComObject su norimos klasės programiniu ProgId:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Norėdami sukurti savo objektus su savavališka struktūra, naudoti New-Object atrodo pernelyg archajiška ir sudėtinga; ši cmdlet naudojama dirbti su programinės įrangos komponentais, nepriklausančiais PowerShell. Kituose straipsniuose šis klausimas bus aptartas išsamiau. Be .NET ir COM objektų, mes taip pat tyrinėsime CIM (WMI) ir ADSI objektus.
Statinių metodų iškvietimas
Kai kurių .NET Core klasių neįmanoma sukurti, įskaitant System.Environment ir System.Math. Jie yra
[System.Environment] | Get-Member
Norėdami peržiūrėti tik statinius narius, skambinkite Get-Member naudodami parametrą -Static (atkreipkite dėmesį į objekto tipą):
[System.Environment] | Get-Member -Static
Norėdami pasiekti statines ypatybes ir metodus, vietoj taško po raidės naudokite du dvitaškius iš eilės:
[System.Environment]::OSVersion
Or
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
Įveskite PSCustomObject
Tarp daugelio PowerShell galimų duomenų tipų verta paminėti PSCustomObject, skirtą savavališkos struktūros objektams saugoti. Tokio objekto kūrimas naudojant cmdlet „New-Object“ laikomas klasikiniu, bet sudėtingu ir pasenusiu būdu:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Pažvelkime į objekto struktūrą:
$object | Get-Member
Pradedant nuo PowerShell 3.0, galima kita sintaksė:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Duomenis galite pasiekti vienu iš lygiaverčių būdų:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Štai pavyzdys, kaip konvertuoti esamą maišos lentelę į objektą:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()
Vienas iš šio tipo objektų trūkumų – gali keistis jų savybių tvarka. Norėdami to išvengti, turite naudoti atributą [ordered]:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Yra ir kitų objekto kūrimo parinkčių: aukščiau pažvelgėme į cmdlet naudojimą
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
„Add-Member“ cmdlet leidžia pridėti ne tik ypatybes, bet ir metodus prie anksčiau sukurto $objekto naudojant „-MemberType ScriptMethod“ konstrukciją:
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Atkreipkite dėmesį, kad naujojo metodo kodui išsaugoti naudojome $ScriptBlock kintamąjį, kurio tipas yra ScriptBlock.
Norėdami pašalinti savybes, naudokite atitinkamą metodą:
$object.psobject.properties.remove('Name')
Kurti savo klases
PowerShell 5.0 pristatė galimybę apibrėžti
class MyClass
{
# тело класса
}
Tai tikras .NET Core tipas, kurio turinys aprašo jo savybes, metodus ir kitus elementus. Pažvelkime į paprasčiausios klasės apibrėžimo pavyzdį:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Norėdami sukurti objektą (klasės egzempliorių), naudokite cmdlet
$object = New-Object -TypeName MyClass
arba
$object = [MyClass]::new()
Išanalizuokime objekto struktūrą:
$object | Get-Member
Nepamirškite apie taikymo sritį: negalite nurodyti tipo pavadinimo kaip eilutės arba naudoti tipo literatūrą už scenarijaus ar modulio, kuriame yra apibrėžta klasė. Šiuo atveju funkcijos gali grąžinti klasių egzempliorius (objektus), kurie bus pasiekiami už modulio ar scenarijaus ribų.
Sukūrę objektą, užpildykite jo savybes:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Atminkite, kad klasės aprašyme nurodomi ne tik ypatybių tipai, bet ir numatytosios jų reikšmės:
class Example
{
[string]$Name = 'John Doe'
}
Klasės metodo aprašymas primena funkcijos aprašymą, tačiau nenaudojamas funkcijos žodis. Kaip ir funkcijoje, prireikus parametrai perduodami metodams:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#описание метода
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Dabar mūsų klasės atstovė gali šypsotis:
$object = [MyClass]::new()
$object.Smile($true)
Metodai gali būti perkrauti, be to, klasė turi
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
Mūsų darbo su objektais PowerShell aprašymas nėra išsamus. Tolesniuose leidiniuose bandysime tai pagilinti praktiniais pavyzdžiais: penktasis serijos straipsnis bus skirtas PowerShell integravimo su trečiųjų šalių programinės įrangos komponentais problemoms. Ankstesnes dalis galite rasti žemiau esančiose nuorodose.
Šaltinis: www.habr.com