Komentojen tekstitulostus PowerShell-tulkkiikkunassa on vain tapa näyttää tietoa ihmisen havainnointiin sopivassa muodossa. Itse asiassa keskiviikkona
Vastaaja:
Objektit PowerShellissä
Muistetaan, että objekti on kokoelma tietokenttiä (ominaisuudet, tapahtumat jne.) ja menetelmiä niiden käsittelemiseksi (metodeja). Sen rakenteen määrittelee tyyppi, joka yleensä perustuu yhtenäistetyssä .NET Core -alustassa käytettyihin luokkiin. On myös mahdollista työskennellä COM-, CIM- (WMI)- ja ADSI-objektien kanssa. Ominaisuuksia ja menetelmiä tarvitaan erilaisten toimintojen suorittamiseen tiedoilla, lisäksi PowerShellissä objekteja voidaan välittää argumenteina funktioille ja cmdleteille, määrittää niiden arvot muuttujille, ja siellä on myös
Esineiden rakenteen tarkastelu
Suoritetaan esimerkiksi Get-Process cmdlet, jonka avulla voit saada tietoja järjestelmässä käynnissä olevista prosesseista:
Se näyttää joitakin muotoiltuja tekstitietoja, jotka eivät anna mitään käsitystä palautettujen objektien ominaisuuksista ja niiden menetelmistä. Tulostuksen hienosäätöä varten meidän on opittava tutkimaan objektien rakennetta, ja Get-Member-cmdlet auttaa meitä tässä:
Get-Process | Get-Member
Täällä näemme jo tyypin ja rakenteen, ja lisäparametrien avulla voimme esimerkiksi näyttää vain syötteeseen sisältyvän objektin ominaisuudet:
Get-Process | Get-Member -MemberType Property
Tätä tietoa tarvitaan hallinnollisten ongelmien ratkaisemiseen interaktiivisesti tai omien komentosarjojen kirjoittamiseen: esimerkiksi tietojen saamiseksi ripustetuista prosesseista Responding-ominaisuuden avulla.
Objektien suodatus
PowerShell sallii tietyn ehdon täyttävien objektien kuljettamisen liukuhihnan läpi:
Where-Object { блок сценария }
Suluissa olevan komentosarjalohkon suorittamisen tuloksen on oltava looginen arvo. Jos se on tosi ($true), Where-Object-cmdletiin syötetty objekti välitetään liukuhihnaa pitkin, muuten ($false) se poistetaan. Näytetään esimerkiksi luettelo pysäytetyistä Windows Server -palveluista, ts. ne, joiden Status-ominaisuuden arvo on "Pysäytetty":
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Tässä taas näemme tekstiesityksen, mutta jos haluat ymmärtää putkilinjan läpi kulkevien objektien tyypin ja sisäisen rakenteen, se ei ole vaikeaa:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Objektien lajittelu
Esineiden liukuhihnakäsittelyssä on usein tarve lajitella ne. Sort-Object-cmdlet välittyy ominaisuuksien nimet (lajitteluavaimet) ja palauttaa objektit arvojensa mukaan järjestetyssä järjestyksessä. Käynnissä olevien prosessien tulosteet on helppo lajitella suorittimen kulutetun ajan mukaan (prosessoriominaisuus):
Get-Process | Sort-Object –Property cpu
-Property-parametri voidaan jättää pois kutsuttaessa Sort-Object-cmdlet-komentoa; sitä käytetään oletuksena. Käytä käänteiseen lajitteluun -Descending -parametria:
Get-Process | Sort-Object cpu -Descending
Esineiden ja niiden osien valinta
Select-Object -cmdletin avulla voit valita tietyn määrän objekteja liukuhihnan alussa tai lopussa käyttämällä -First- tai -Last -parametreja. Sen avulla voit valita yksittäisiä objekteja tai tiettyjä ominaisuuksia sekä luoda niiden perusteella uusia objekteja. Katsotaanpa, miten cmdlet toimii yksinkertaisten esimerkkien avulla.
Seuraava komento näyttää tiedot 10 prosessista, jotka kuluttavat enimmäismäärän RAM-muistia (WS-ominaisuus):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Voit valita vain tiettyjä liukuhihnan läpi kulkevien objektien ominaisuuksia ja luoda uusia ominaisuuksia niiden perusteella:
Get-Process | Select-Object ProcessName, Id -First 1
Liukuhihnan toiminnan seurauksena saamme uuden objektin, jonka rakenne eroaa Get-Process cmdletin palauttamasta rakenteesta. Varmistetaan tämä Get-Memberin avulla:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Huomaa, että Select-Object palauttaa yhden objektin (-First 1), jossa on vain kaksi määrittämäämme kenttää: niiden arvot kopioitiin ensimmäisestä objektista, jonka Get-Process-cmdlet välitti liukuhihnaan. Yksi tavoista luoda objekteja PowerShell-skripteissä perustuu Select-Objectin käyttöön:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
Käyttämällä Select-Object-toimintoa voit lisätä laskettuja ominaisuuksia objekteihin, jotka on esitettävä
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Katsotaanpa kuljettimen läpi kulkevien esineiden rakennetta:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
ForEach-Object, Group-Object ja Measure-Object
Objektien kanssa työskentelemiseen on muitakin cmdlet-komentoja. Puhutaanpa esimerkkinä kolmesta hyödyllisimmästä:
Jokaiselle esineelle voit suorittaa PowerShell-koodin kullekin liukuhihnassa olevalle objektille:
ForEach-Object { блок сценария }
Ryhmä-objekti ryhmittelee objektit ominaisuuden arvon mukaan:
Group-Object PropertyName
Jos suoritat sen parametrilla -NoElement, saat selville ryhmien elementtien lukumäärän.
Measure-Object kokoaa erilaisia yhteenvetoparametreja objektikentän arvojen mukaan liukuhihnassa (laskee summan ja löytää myös minimi-, maksimi- tai keskiarvon):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Yleensä käsiteltyjä cmdlet-komentoja käytetään interaktiivisesti, ja ne luodaan usein komentosarjoilla.
.NET- ja COM-objektien luominen (New-Object)
On monia ohjelmistokomponentteja, joissa on .NET Core- ja COM-liitännät, joista on hyötyä järjestelmänvalvojille. System.Diagnostics.EventLog-luokan avulla voit hallita järjestelmälokeja suoraan Windows PowerShellistä. Katsotaanpa esimerkkiä tämän luokan ilmentymän luomisesta New-Object-cmdletillä parametrin -TypeName kanssa:
New-Object -TypeName System.Diagnostics.EventLog
Koska emme määrittäneet tiettyä tapahtumalokia, tuloksena oleva luokan esiintymä ei sisällä tietoja. Jos haluat muuttaa tätä, sinun on kutsuttava erityinen konstruktorimenetelmä sen luomisen aikana käyttämällä -ArgumentList-parametria. Jos haluamme käyttää sovelluslokia, meidän tulee välittää merkkijono "Application" argumenttina rakentajalle:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Huomaa, että tallensimme komennon tulosteen $AppLog-muuttujaan. Vaikka liukuputkia käytetään yleisesti interaktiivisessa tilassa, komentosarjojen kirjoittaminen vaatii usein viittauksen säilyttämistä objektiin. Lisäksi ydin.NET Core -luokat sisältyvät System-nimiavaruuteen: PowerShell etsii oletusarvoisesti siitä tiettyjä tyyppejä, joten Diagnostics.EventLog-tiedoston kirjoittaminen System.Diagnostics.EventLogin sijaan on aivan oikein.
Voit työskennellä lokin kanssa sopivilla menetelmillä:
$AppLog | Get-Member -MemberType Method
Oletetaan, että se tyhjennetään Clear()-menetelmällä, jos käyttöoikeuksia on:
$AppLog.Clear()
New-Object-cmdlet-komentoa käytetään myös COM-komponenttien kanssa työskentelemiseen. Niitä on melko paljon - Windowsin komentosarjapalvelimen mukana toimitetuista kirjastoista ActiveX-sovelluksiin, kuten Internet Exploreriin. COM-objektin luomiseksi sinun on asetettava -ComObject-parametri halutun luokan ohjelmallisella ProgId:llä:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Omien objektien luominen mielivaltaisella rakenteella New-Objectin käyttö näyttää liian vanhanaikaiselta ja hankalalta; tätä cmdlet-komentoa käytetään PowerShellin ulkoisten ohjelmistokomponenttien kanssa työskentelemiseen. Tulevissa artikkeleissa tätä asiaa käsitellään tarkemmin. NET- ja COM-objektien lisäksi tutkimme myös CIM- (WMI)- ja ADSI-objekteja.
Staattisten menetelmien kutsuminen
Joitakin .NET Core -luokkia ei voida toteuttaa, mukaan lukien System.Environment ja System.Math. He ovat
[System.Environment] | Get-Member
Jos haluat tarkastella vain staattisia jäseniä, kutsu Get-Member -Static-parametrilla (huomaa objektityyppi):
[System.Environment] | Get-Member -Static
Jos haluat käyttää staattisia ominaisuuksia ja menetelmiä, käytä kahta peräkkäistä kaksoispistettä pisteen sijaan literaalin jälkeen:
[System.Environment]::OSVersion
tai
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
Kirjoita PSCustomObject
PowerShellissä saatavilla olevista lukuisista tietotyypeistä kannattaa mainita PSCustomObject, joka on suunniteltu mielivaltaisen rakenteen omaavien objektien tallentamiseen. Tällaisen objektin luomista New-Object-cmdletillä pidetään klassisena, mutta hankalana ja vanhentuneena tapana:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Katsotaanpa kohteen rakennetta:
$object | Get-Member
PowerShell 3.0:sta alkaen toinen syntaksi on saatavilla:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Voit käyttää tietoja jollakin vastaavista tavoista:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Tässä on esimerkki olemassa olevan hash-taulukon muuntamisesta objektiksi:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()
Yksi tämäntyyppisten objektien haitoista on, että niiden ominaisuuksien järjestys voi muuttua. Tämän välttämiseksi sinun on käytettävä [ordered]-attribuuttia:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Objektin luomiseen on muitakin vaihtoehtoja: edellä tarkastelimme cmdlet-komentoa
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
Add-Member -cmdlet antaa sinun lisätä ominaisuuksien lisäksi myös menetelmiä aiemmin luotuun $objektiin käyttämällä "-MemberType ScriptMethod" -rakennetta:
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Huomaa, että käytimme ScriptBlock-tyyppistä $ScriptBlock-muuttujaa uuden menetelmän koodin tallentamiseen.
Voit poistaa ominaisuuksia käyttämällä vastaavaa menetelmää:
$object.psobject.properties.remove('Name')
Omien kurssien luominen
PowerShell 5.0 esitteli mahdollisuuden määritellä
class MyClass
{
# тело класса
}
Tämä on todellinen .NET Core -tyyppi, jonka runko kuvaa sen ominaisuuksia, menetelmiä ja muita elementtejä. Katsotaanpa esimerkkiä yksinkertaisimman luokan määrittämisestä:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Luo objekti (luokkainstanssi) cmdlet-komennolla
$object = New-Object -TypeName MyClass
tai
$object = [MyClass]::new()
Analysoidaan objektin rakennetta:
$object | Get-Member
Älä unohda laajuutta: et voi viitata tyypin nimeen merkkijonona tai käyttää tyyppiliteraalia sen komentosarjan tai moduulin ulkopuolella, jossa luokka on määritelty. Tässä tapauksessa funktiot voivat palauttaa luokkaesiintymiä (objekteja), jotka ovat käytettävissä moduulin tai komentosarjan ulkopuolella.
Kun olet luonut objektin, täytä sen ominaisuudet:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Huomaa, että luokan kuvaus ei määrittele vain ominaisuustyypit, vaan myös niiden oletusarvot:
class Example
{
[string]$Name = 'John Doe'
}
Luokkametodin kuvaus muistuttaa funktion kuvausta, mutta ilman funktiosanaa. Kuten funktiossa, parametrit välitetään tarvittaessa menetelmille:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#описание метода
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Nyt luokkamme edustaja voi hymyillä:
$object = [MyClass]::new()
$object.Smile($true)
Menetelmät voivat olla ylikuormitettuja, lisäksi luokassa on
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
Kuvauksemme objektien kanssa työskentelemisestä PowerShellissä on tuskin tyhjentävä. Seuraavissa julkaisuissa yritämme syventää sitä käytännön esimerkein: sarjan viides artikkeli on omistettu PowerShellin integroimiseen kolmansien osapuolien ohjelmistokomponentteihin. Aiemmat osat löytyvät alla olevista linkeistä.
Lähde: will.com