Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Besedilni izhod ukazov v oknu tolmača PowerShell je le način za prikaz informacij v obliki, primerni za človeško zaznavo. Pravzaprav sreda usmerjeno za delo s predmeti: cmdleti in funkcije jih prejmejo kot vhod in vrnil na izhodu, in vrste spremenljivk, ki so na voljo interaktivno in v skriptih, temeljijo na razredih .NET. V četrtem članku serije bomo podrobneje preučili delo s predmeti.

Kazalo:

Predmeti v PowerShell
Ogled strukture predmetov
Filtriranje predmetov
Razvrščanje predmetov
Izbira predmetov in njihovih delov
ForEach-Object, Group-Object in Measure-Object
Ustvarjanje objektov .NET in COM (New-Object)
Klicanje statičnih metod
Vnesite PSCustomObject
Ustvarjanje lastnih razredov

Predmeti v PowerShell

Spomnimo se, da je objekt zbirka podatkovnih polj (lastnosti, dogodkov itd.) in metod za njihovo obdelavo (metod). Njegova struktura je določena s tipom, ki običajno temelji na razredih, ki se uporabljajo v enotni platformi .NET Core. Možno je tudi delo z objekti COM, CIM (WMI) in ADSI. Lastnosti in metode so potrebne za izvajanje različnih dejanj na podatkih; poleg tega je v lupini PowerShell mogoče posredovati predmete kot argumente funkcijam in cmdletom, njihove vrednosti dodeliti spremenljivkam, obstaja pa tudi mehanizem sestavljanja ukazov (tekoči ali cevovod). Vsak ukaz v cevovodu posreduje svoj izhod naslednjemu po vrsti, objekt za objektom. Za obdelavo lahko uporabite prevedene ukaze cmdlet ali ustvarite svojega napredne funkcijeza izvajanje različnih manipulacij s predmeti v cevovodu: filtriranje, razvrščanje, združevanje in celo spreminjanje njihove strukture. Pošiljanje podatkov v tej obliki ima resno prednost: sprejemni skupini ni treba razčleniti toka bajtov (besedila), vse potrebne informacije je enostavno pridobiti s klicem ustreznih lastnosti in metod.

Ogled strukture predmetov

Na primer, zaženimo cmdlet Get-Process, ki vam omogoča pridobivanje informacij o procesih, ki se izvajajo v sistemu:

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Prikazal bo nekaj oblikovanih besedilnih podatkov, ki ne dajejo nobene predstave o lastnostih vrnjenih predmetov in njihovih metod. Za natančno nastavitev izhoda se moramo naučiti, kako preučiti strukturo predmetov, pri čemer nam bo pomagal cmdlet Get-Member:

Get-Process | Get-Member

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Tu že vidimo vrsto in strukturo, s pomočjo dodatnih parametrov pa lahko na primer prikažemo samo lastnosti predmeta, vključenega v vnos:

Get-Process | Get-Member -MemberType Property

To znanje bo potrebno za interaktivno reševanje skrbniških težav ali za pisanje lastnih skriptov: na primer za pridobivanje informacij o obešenih procesih z uporabo lastnosti Responding.

Filtriranje predmetov

PowerShell omogoča, da se objekti, ki izpolnjujejo določen pogoj, prenesejo skozi cevovod:

Where-Object { блок сценария }

Rezultat izvajanja bloka skripta v oklepaju mora biti logična vrednost. Če je res ($true), bo predmet, ki je vnesen v ukaz cmdlet Where-Object, poslan po cevovodu, sicer ($false) pa bo izbrisan. Na primer, prikažimo seznam ustavljenih storitev Windows Server, tj. tisti, katerih lastnost statusa je nastavljena na »Stopped«:

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

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Tukaj spet vidimo besedilno predstavitev, a če želite razumeti vrsto in notranjo strukturo predmetov, ki gredo skozi cevovod, ni težko:

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

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Razvrščanje predmetov

Pri cevovodni obdelavi predmetov jih je pogosto treba razvrstiti. Cmdlet Sort-Object prejme imena lastnosti (ključi za razvrščanje) in vrne predmete, razvrščene po njihovih vrednostih. Izhod tekočih procesov je preprosto razvrstiti glede na porabljen čas procesorja (lastnost procesorja):

Get-Process | Sort-Object –Property cpu

Parameter -Property lahko izpustite pri klicu ukaza cmdlet Sort-Object; uporablja se privzeto. Za obratno razvrščanje uporabite parameter -Descending:

Get-Process | Sort-Object cpu -Descending

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Izbira predmetov in njihovih delov

Cmdlet Select-Object vam omogoča, da izberete določeno število objektov na začetku ali koncu cevovoda z uporabo parametrov -First ali -Last. Z njegovo pomočjo lahko izberete posamezne predmete ali določene lastnosti in na njihovi podlagi ustvarite nove objekte. Oglejmo si, kako cmdlet deluje na preprostih primerih.

Naslednji ukaz prikaže informacije o 10 procesih, ki porabijo največjo količino RAM-a (lastnost WS):

Get-Process | Sort-Object WS -Descending | Select-Object -First 10

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Izberete lahko le določene lastnosti predmetov, ki gredo skozi cevovod, in na njihovi podlagi ustvarite nove:

Get-Process | Select-Object ProcessName, Id -First 1

Kot rezultat delovanja cevovoda bomo prejeli nov objekt, katerega struktura se bo razlikovala od strukture, ki jo vrne cmdlet Get-Process. Preverimo to z Get-Member:

Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Upoštevajte, da Select-Object vrne en sam predmet (-First 1), ki ima samo dve od polji, ki smo jih podali: njuni vrednosti sta bili kopirani iz prvega predmeta, ki ga je cmdlet Get-Process posredoval v cevovod. Eden od načinov ustvarjanja predmetov v skriptih PowerShell temelji na uporabi Select-Object:

$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Z uporabo Select-Object lahko objektom, ki jih je treba predstaviti, dodate izračunane lastnosti zgoščene tabele. V tem primeru vrednost njegovega prvega ključa ustreza imenu lastnosti, vrednost drugega ključa pa ustreza vrednosti lastnosti za trenutni element cevovoda:

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Poglejmo strukturo predmetov, ki gredo skozi tekoči trak:

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

ForEach-Object, Group-Object in Measure-Object

Za delo s predmeti obstajajo tudi drugi cmdleti. Kot primer se pogovorimo o treh najbolj uporabnih:

Za vsak predmet omogoča zagon kode PowerShell za vsak predmet v cevovodu:

ForEach-Object { блок сценария }

Skupina-predmet združuje predmete po vrednosti lastnosti:

Group-Object PropertyName

Če ga zaženete s parametrom -NoElement, lahko ugotovite število elementov v skupinah.

Meri-predmet združuje različne parametre povzetka po vrednostih polj objekta v cevovodu (izračuna vsoto in najde tudi najmanjšo, največjo ali povprečno vrednost):

Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum

Običajno se obravnavani cmdleti uporabljajo interaktivno in so pogosto ustvarjeni v skriptih. funkcije z bloki Začetek, Proces in Konec.

Ustvarjanje objektov .NET in COM (New-Object)

Obstaja veliko komponent programske opreme z vmesnikoma .NET Core in COM, ki so uporabne za sistemske skrbnike. Z uporabo razreda System.Diagnostics.EventLog lahko upravljate sistemske dnevnike neposredno iz lupine Windows PowerShell. Oglejmo si primer ustvarjanja primerka tega razreda z ukazom cmdlet New-Object s parametrom -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Ker nismo navedli posebnega dnevnika dogodkov, nastali primerek razreda ne vsebuje podatkov. Če želite to spremeniti, morate med ustvarjanjem poklicati posebno metodo konstruktorja s parametrom -ArgumentList. Če želimo dostopati do dnevnika aplikacije, moramo konstruktorju posredovati niz "Application" kot argument:

$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Upoštevajte, da smo izhod ukaza shranili v spremenljivko $AppLog. Čeprav se cevovodi običajno uporabljajo v interaktivnem načinu, pisanje skriptov pogosto zahteva vzdrževanje sklicevanja na objekt. Poleg tega so osnovni razredi .NET Core vsebovani v sistemskem imenskem prostoru: PowerShell privzeto išče določene vrste v njem, zato je zapis Diagnostics.EventLog namesto System.Diagnostics.EventLog povsem pravilen.

Za delo z dnevnikom lahko uporabite ustrezne metode:

$AppLog | Get-Member -MemberType Method

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Recimo, da ga počisti metoda Clear(), če obstajajo pravice dostopa:

$AppLog.Clear()

Cmdlet New-Object se uporablja tudi za delo s komponentami COM. Teh je precej - od knjižnic, ki so priložene skriptnemu strežniku Windows, do aplikacij ActiveX, kot je Internet Explorer. Če želite ustvariti objekt COM, morate nastaviti parameter -ComObject s programskim ProgId želenega razreda:

New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

Za ustvarjanje lastnih objektov s poljubno strukturo se zdi uporaba New-Object preveč arhaična in okorna; ta cmdlet se uporablja za delo s komponentami programske opreme, ki niso PowerShell. V prihodnjih člankih bo to vprašanje podrobneje obravnavano. Poleg objektov .NET in COM bomo raziskovali tudi objekte CIM (WMI) in ADSI.

Klicanje statičnih metod

Nekaterih razredov .NET Core ni mogoče instancirati, vključno s System.Environment in System.Math. So statična in vsebujejo le statične lastnosti in metode. To so v bistvu referenčne knjižnice, ki se uporabljajo brez ustvarjanja objektov. Na statični razred se lahko sklicujete prek literala, tako da ime tipa zaprete v oglate oklepaje. Vendar, če pogledamo strukturo objekta z uporabo Get-Member, bomo videli tip System.RuntimeType namesto System.Environment:

[System.Environment] | Get-Member

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Če si želite ogledati samo statične člane, pokličite Get-Member s parametrom -Static (upoštevajte vrsto predmeta):

[System.Environment] | Get-Member -Static

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Za dostop do statičnih lastnosti in metod uporabite dve zaporedni dvopičji namesto pike za literalom:

[System.Environment]::OSVersion

Or

$test=[System.Math]::Sqrt(25) 
$test
$test.GetType()

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Vnesite PSCustomObject

Med številnimi vrstami podatkov, ki so na voljo v lupini PowerShell, velja omeniti PSCustomObject, namenjen shranjevanju objektov s poljubno strukturo. Ustvarjanje takega predmeta z ukazom cmdlet New-Object velja za klasičen, a okoren in zastarel način:

$object = New-Object  –TypeName PSCustomObject -Property @{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'}

Poglejmo strukturo predmeta:

$object | Get-Member

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Od PowerShell 3.0 dalje je na voljo druga sintaksa:

$object = [PSCustomObject]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

Do podatkov lahko dostopate na enega od enakovrednih načinov:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Tukaj je primer pretvorbe obstoječe zgoščene tabele v objekt:

$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Ena od pomanjkljivosti objektov te vrste je, da se lahko spremeni vrstni red njihovih lastnosti. Da bi se temu izognili, morate uporabiti atribut [ordered]:

$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

Obstajajo še druge možnosti za ustvarjanje predmeta: zgoraj smo si ogledali uporabo ukaza cmdlet Izberite-Predmet. Vse, kar ostane, je ugotoviti dodajanje in odstranjevanje elementov. Narediti to za objekt iz prejšnjega primera je povsem preprosto:

$object | Add-Member –MemberType NoteProperty –Name Age  –Value 33
$object | Get-Member

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Cmdlet Add-Member vam omogoča dodajanje ne samo lastnosti, ampak tudi metod predhodno ustvarjenemu $objectu z uporabo konstrukta "-MemberType ScriptMethod":

$ScriptBlock = {
    # код 
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member

Upoštevajte, da smo za shranjevanje kode za novo metodo uporabili spremenljivko $ScriptBlock tipa ScriptBlock.

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Za odstranitev lastnosti uporabite ustrezno metodo:

$object.psobject.properties.remove('Name')

Ustvarjanje lastnih razredov

PowerShell 5.0 je uvedel možnost definiranja ocene uporabo sintakse, značilne za objektno usmerjene programske jezike. Temu je namenjena storitvena beseda Class, za katero navedite ime razreda in opišite njegovo telo v operatorskih oklepajih:

class MyClass
{
    # тело класса
}

To je pravi tip .NET Core s telesom, ki opisuje njegove lastnosti, metode in druge elemente. Oglejmo si primer definiranja najpreprostejšega razreda:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
}

Če želite ustvariti predmet (instanco razreda), uporabite cmdlet Nov predmet, ali literal tipa [MyClass] in psevdostatična metoda novo (privzeti konstruktor):

$object = New-Object -TypeName MyClass

ali

$object = [MyClass]::new()

Analizirajmo strukturo predmeta:

$object | Get-Member

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Ne pozabite na obseg: na ime tipa se ne morete sklicevati kot na niz ali uporabiti literala tipa zunaj skripta ali modula, v katerem je definiran razred. V tem primeru lahko funkcije vrnejo primerke razreda (objekte), ki bodo dostopni izven modula ali skripta.

Ko ustvarite predmet, izpolnite njegove lastnosti:

$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Upoštevajte, da opis razreda ne določa samo vrst lastnosti, ampak tudi njihove privzete vrednosti:

class Example
{
     [string]$Name = 'John Doe'
}

Opis metode razreda je podoben opisu funkcije, vendar brez uporabe funkcijske besede. Kot v funkciji se parametri po potrebi posredujejo metodam:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
     
     #описание метода
     Smile([bool]$param1)
     {
         If($param1) {
            Write-Host ':)'
         }
     }
}

Zdaj se lahko predstavnik našega razreda nasmehne:

$object = [MyClass]::new()
$object.Smile($true)

Metode so lahko preobremenjene; ​​poleg tega ima razred statične lastnosti in metode, kot tudi konstruktorji, katerih imena sovpadajo z imenom samega razreda. Razred, definiran v skriptu ali modulu PowerShell, lahko služi kot osnova za drugega - tako se izvaja dedovanje. V tem primeru je dovoljeno uporabiti obstoječe razrede .NET kot osnovne:

class MyClass2 : MyClass
{
      #тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)

Naš opis dela s predmeti v PowerShell je komaj izčrpen. V naslednjih publikacijah ga bomo poskušali poglobiti s praktičnimi primeri: peti članek v seriji bo posvečen vprašanjem integracije PowerShell s komponentami programske opreme drugih proizvajalcev. Pretekle dele najdete na spodnjih povezavah.

1. del: Osnovne funkcije lupine Windows PowerShell
2. del: Uvod v programski jezik Windows PowerShell
3. del: posredovanje parametrov skriptom in funkcijam, ustvarjanje cmdletov

Kaj je Windows PowerShell in za kaj se uporablja? 4. del: Delo s predmeti, lastni razredi

Vir: www.habr.com

Dodaj komentar