Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Tekstutgangen til kommandoer i PowerShell-tolkvinduet er bare en måte å vise informasjon på i en form som passer for menneskelig oppfatning. Faktisk onsdag orientert å jobbe med objekter: cmdlets og funksjoner mottar dem som input og returnerte ved utgangen, og variabeltypene som er tilgjengelige interaktivt og i skript, er basert på .NET-klasser. I den fjerde artikkelen i serien skal vi studere arbeid med objekter mer detaljert.

Bekreftelse:

Objekter i PowerShell
Se strukturen til objekter
Filtrering av objekter
Sortering av objekter
Velge objekter og deres deler
For hvert-objekt, gruppe-objekt og mål-objekt
Opprette .NET- og COM-objekter (New-Object)
Kaller statiske metoder
Skriv PSCustomObject
Lag dine egne klasser

Objekter i PowerShell

La oss huske at et objekt er en samling av datafelt (egenskaper, hendelser, etc.) og metoder for å behandle dem (metoder). Strukturen er spesifisert av en type, som vanligvis er basert på klasser som brukes i den enhetlige .NET Core-plattformen. Det er også mulig å jobbe med COM, CIM (WMI) og ADSI objekter. Egenskaper og metoder er nødvendig for å utføre ulike handlinger på data; i tillegg, i PowerShell, kan objekter sendes som argumenter til funksjoner og cmdlets, tilordne deres verdier til variabler, og det er også mekanisme for kommandosammensetning (transportør eller rørledning). Hver kommando i pipelinen sender sin utgang til den neste etter tur, objekt for objekt. For behandling kan du bruke kompilerte cmdlets eller lage dine egne avanserte funksjonerå utføre ulike manipulasjoner med objekter i rørledningen: filtrering, sortering, gruppering og til og med endre strukturen deres. Å overføre data i denne formen har en alvorlig fordel: mottakerteamet trenger ikke å analysere bytestrømmen (teksten), all nødvendig informasjon hentes enkelt ved å ringe de riktige egenskapene og metodene.

Se strukturen til objekter

La oss for eksempel kjøre Get-Process cmdleten, som lar deg få informasjon om prosessene som kjører i systemet:

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Den vil vise noen formaterte tekstdata som ikke gir noen ide om egenskapene til de returnerte objektene og deres metoder. For å finjustere utdataene må vi lære å undersøke strukturen til objekter, og Get-Member cmdleten vil hjelpe oss med dette:

Get-Process | Get-Member

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Her ser vi allerede typen og strukturen, og ved hjelp av tilleggsparametere kan vi for eksempel kun vise egenskapene til objektet som er inkludert i inngangen:

Get-Process | Get-Member -MemberType Property

Denne kunnskapen vil være nødvendig for å løse administrasjonsproblemer interaktivt eller for å skrive dine egne skript: for eksempel for å få informasjon om hengte prosesser ved å bruke Responding-egenskapen.

Filtrering av objekter

PowerShell lar objekter som oppfyller en bestemt betingelse føres gjennom en rørledning:

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

Resultatet av å kjøre skriptblokken innenfor parentesen må være en boolsk verdi. Hvis det er sant ($true), vil objektet som er inndata til Where-Object-cmdleten sendes langs rørledningen, ellers ($false) vil det bli slettet. La oss for eksempel vise en liste over stoppede Windows Server-tjenester, dvs. de hvis Status-egenskapen er satt til "Stoppet":

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

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Her ser vi igjen en tekstlig representasjon, men hvis du vil forstå typen og den indre strukturen til objektene som passerer gjennom rørledningen, er det ikke vanskelig:

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

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Sortering av objekter

Ved rørledningsbehandling av objekter er det ofte behov for å sortere dem. Sort-Object-cmdleten sendes navnene på egenskaper (sorteringsnøkler) og returnerer objekter sortert etter verdiene deres. Det er enkelt å sortere utdataene fra kjørende prosesser etter CPU-tid brukt (cpu-egenskap):

Get-Process | Sort-Object –Property cpu

-Property-parameteren kan utelates når du kaller Sort-Object-cmdleten; den brukes som standard. For omvendt sortering, bruk parameteren -Descending:

Get-Process | Sort-Object cpu -Descending

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Velge objekter og deres deler

Select-Object-cmdleten lar deg velge et spesifikt antall objekter på begynnelsen eller slutten av en pipeline ved å bruke parameterne -First eller -Last. Med dens hjelp kan du velge enkeltobjekter eller visse egenskaper, og også lage nye objekter basert på dem. La oss se på hvordan cmdleten fungerer ved å bruke enkle eksempler.

Følgende kommando viser informasjon om de 10 prosessene som bruker den maksimale mengden RAM (WS-egenskap):

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

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Du kan bare velge visse egenskaper for objekter som passerer gjennom rørledningen og lage nye basert på dem:

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

Som et resultat av driften av rørledningen vil vi motta et nytt objekt, hvis struktur vil avvike fra strukturen som returneres av Get-Process cmdlet. La oss bekrefte dette ved å bruke Get-Member:

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

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Merk at Select-Object returnerer et enkelt objekt (-First 1) som bare har to av feltene vi spesifiserte: verdiene deres ble kopiert fra det første objektet som ble sendt inn i pipelinen av Get-Process cmdleten. En av måtene å lage objekter i PowerShell-skript er basert på å bruke Select-Object:

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

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Ved å bruke Select-Object kan du legge til beregnede egenskaper til objekter som må representeres som hasjtabeller. I dette tilfellet tilsvarer verdien av den første nøkkelen egenskapsnavnet, og verdien til den andre nøkkelen tilsvarer egenskapsverdien for det gjeldende rørledningselementet:

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

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

La oss se på strukturen til gjenstander som passerer gjennom transportøren:

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

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

For hvert-objekt, gruppe-objekt og mål-objekt

Det finnes andre cmdlets for å jobbe med objekter. Som et eksempel, la oss snakke om de tre mest nyttige:

For hvert objekt lar deg kjøre PowerShell-kode for hvert objekt i pipelinen:

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

Gruppe-objekt grupperer objekter etter egenskapsverdi:

Group-Object PropertyName

Hvis du kjører den med parameteren -NoElement, kan du finne ut antall elementer i gruppene.

Mål-objekt samler ulike oppsummeringsparametere etter objektfeltverdier i rørledningen (beregner summen, og finner også minimums-, maksimums- eller gjennomsnittsverdien):

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

Vanligvis brukes cmdletene som diskuteres interaktivt, og lages ofte i skript. funksjoner med start-, prosess- og sluttblokker.

Opprette .NET- og COM-objekter (New-Object)

Det er mange programvarekomponenter med .NET Core- og COM-grensesnitt som er nyttige for systemadministratorer. Ved å bruke System.Diagnostics.EventLog-klassen kan du administrere systemlogger direkte fra Windows PowerShell. La oss se på et eksempel på å lage en forekomst av denne klassen ved å bruke New-Object-cmdleten med parameteren -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Siden vi ikke spesifiserte en spesifikk hendelseslogg, inneholder den resulterende forekomsten av klassen ingen data. For å endre dette, må du kalle en spesiell konstruktørmetode under opprettelsen ved å bruke parameteren -ArgumentList. Hvis vi vil ha tilgang til applikasjonsloggen, bør vi sende strengen "Application" som et argument til konstruktøren:

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

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Vær oppmerksom på at vi lagret utdataene fra kommandoen i $AppLog-variabelen. Selv om rørledninger ofte brukes i interaktiv modus, krever skriving av skript ofte å opprettholde en referanse til et objekt. I tillegg er kjerneklassene .NET Core inneholdt i systemnavneområdet: PowerShell ser som standard etter spesifiserte typer i det, så å skrive Diagnostics.EventLog i stedet for System.Diagnostics.EventLog er ganske riktig.

For å jobbe med loggen kan du bruke de riktige metodene:

$AppLog | Get-Member -MemberType Method

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

La oss si at det slettes av Clear()-metoden hvis det er tilgangsrettigheter:

$AppLog.Clear()

New-Object-cmdleten brukes også til å jobbe med COM-komponenter. Det er ganske mange av dem - fra bibliotekene som følger med Windows-skriptserveren til ActiveX-applikasjoner, for eksempel Internet Explorer. For å lage et COM-objekt, må du sette parameteren -ComObject med den programmatiske ProgId for ønsket klasse:

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

For å lage dine egne objekter med en vilkårlig struktur, virker bruk av New-Object for arkaisk og tungvint; denne cmdleten brukes til å jobbe med programvarekomponenter eksternt til PowerShell. I fremtidige artikler vil dette problemet bli diskutert mer detaljert. I tillegg til .NET- og COM-objekter vil vi også utforske CIM (WMI)- og ADSI-objekter.

Kaller statiske metoder

Noen .NET Core-klasser kan ikke instansieres, inkludert System.Environment og System.Math. De er statisk og inneholder kun statiske egenskaper og metoder. Dette er i hovedsak referansebiblioteker som brukes uten å lage objekter. Du kan referere til en statisk klasse gjennom en bokstavelig ved å sette typenavnet i hakeparenteser. Men hvis vi ser på strukturen til objektet ved hjelp av Get-Member, vil vi se typen System.RuntimeType i stedet for System.Environment:

[System.Environment] | Get-Member

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

For å se kun statiske medlemmer, ring Get-Member med parameteren -Static (merk objekttypen):

[System.Environment] | Get-Member -Static

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

For å få tilgang til statiske egenskaper og metoder, bruk to påfølgende kolon i stedet for et punktum etter bokstaven:

[System.Environment]::OSVersion

eller

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

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Skriv PSCustomObject

Blant de mange datatypene som er tilgjengelige i PowerShell, er det verdt å nevne PSCustomObject, designet for lagring av objekter med en vilkårlig struktur. Å lage et slikt objekt ved hjelp av New-Object-cmdleten regnes som en klassisk, men tungvint og utdatert måte:

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

La oss se på strukturen til objektet:

$object | Get-Member

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Fra og med PowerShell 3.0 er en annen syntaks tilgjengelig:

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

Du kan få tilgang til dataene på en av de tilsvarende måtene:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Her er et eksempel på å konvertere en eksisterende hashtabell til et objekt:

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

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

En av ulempene med objekter av denne typen er at rekkefølgen på egenskapene deres kan endres. For å unngå dette må du bruke [ordered]-attributtet:

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

Det er andre alternativer for å lage et objekt: ovenfor så vi på å bruke cmdleten Velg-Object. Alt som gjenstår er å finne ut å legge til og fjerne elementer. Å gjøre dette for objektet fra forrige eksempel er ganske enkelt:

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

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Add-Member cmdleten lar deg legge til ikke bare egenskaper, men også metoder til et tidligere opprettet $objekt ved å bruke "-MemberType ScriptMethod"-konstruksjonen:

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

Vær oppmerksom på at vi brukte $ScriptBlock-variabelen av typen ScriptBlock for å lagre koden for den nye metoden.

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

For å fjerne egenskaper, bruk den tilsvarende metoden:

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

Lag dine egne klasser

PowerShell 5.0 introduserte muligheten til å definere klasser ved å bruke syntaks som er karakteristisk for objektorienterte programmeringsspråk. Tjenesteordet Klasse er ment for dette, hvoretter du skal angi navnet på klassen og beskrive dens kropp i operatørparentes:

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

Dette er en ekte .NET Core-type, med en kropp som beskriver egenskapene, metodene og andre elementer. La oss se på et eksempel på å definere den enkleste klassen:

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

For å lage et objekt (klasseforekomst), bruk cmdleten Nytt-objekt, eller en bokstavelig type [MyClass] og pseudostatisk metode ny (standard konstruktør):

$object = New-Object -TypeName MyClass

eller

$object = [MyClass]::new()

La oss analysere strukturen til objektet:

$object | Get-Member

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Ikke glem scope: du kan ikke referere til et typenavn som en streng eller bruke en type bokstavelig utenfor skriptet eller modulen der klassen er definert. I dette tilfellet kan funksjoner returnere klasseforekomster (objekter) som vil være tilgjengelige utenfor modulen eller skriptet.

Etter å ha opprettet objektet, fyll inn egenskapene:

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

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Merk at klassebeskrivelsen spesifiserer ikke bare egenskapstypene, men også standardverdiene deres:

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

Beskrivelsen av en klassemetode ligner beskrivelsen av en funksjon, men uten bruk av funksjonsordet. Som i en funksjon sendes parametere til metoder om nødvendig:

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

Nå kan representanten for klassen vår smile:

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

Metoder kan overbelastes, i tillegg har en klasse statiske egenskaper og metoder, samt konstruktører hvis navn sammenfaller med navnet på selve klassen. En klasse definert i et skript eller en PowerShell-modul kan tjene som en base for en annen - dette er hvordan arv implementeres. I dette tilfellet er det tillatt å bruke eksisterende .NET-klasser som basisklasser:

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

Vår beskrivelse av arbeid med objekter i PowerShell er neppe uttømmende. I de følgende publikasjonene vil vi prøve å utdype det med praktiske eksempler: den femte artikkelen i serien vil være viet til spørsmålene om å integrere PowerShell med tredjeparts programvarekomponenter. Tidligere deler finner du på lenkene nedenfor.

Del 1: Grunnleggende Windows PowerShell-funksjoner
Del 2: Introduksjon til Windows PowerShell-programmeringsspråket
Del 3: overføre parametere til skript og funksjoner, lage cmdlets

Hva er Windows PowerShell og hva brukes det til? Del 4: Arbeid med objekter, egne klasser

Kilde: www.habr.com

Legg til en kommentar