Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Tekstoutputtet af kommandoer i PowerShell-fortolkervinduet er blot en måde at vise information på i en form, der er egnet til menneskelig opfattelse. Faktisk onsdag orienteret at arbejde med objekter: cmdlets og funktioner modtager dem som input og vendte tilbage ved udgangen, og de variabeltyper, der er tilgængelige interaktivt og i scripts, er baseret på .NET-klasser. I den fjerde artikel i serien vil vi studere arbejdet med objekter mere detaljeret.

Indholdsfortegnelse:

Objekter i PowerShell
Se strukturen af ​​objekter
Filtrering af objekter
Sortering af objekter
Valg af objekter og deres dele
ForHver-Objekt, Gruppe-Objekt og Mål-Objekt
Oprettelse af .NET- og COM-objekter (New-Object)
Kalder statiske metoder
Skriv PSCustomObject
Opret dine egne klasser

Objekter i PowerShell

Lad os huske, at et objekt er en samling af datafelter (egenskaber, hændelser osv.) og metoder til at behandle dem (metoder). Dens struktur er specificeret af en type, som normalt er baseret på klasser, der bruges i den forenede .NET Core-platform. Det er også muligt at arbejde med COM, CIM (WMI) og ADSI objekter. Egenskaber og metoder er nødvendige for at udføre forskellige handlinger på data; desuden i PowerShell kan objekter sendes som argumenter til funktioner og cmdlets, tildeles deres værdier til variabler, og der er også kommandosammensætningsmekanisme (transportør eller rørledning). Hver kommando i pipelinen sender sit output til den næste på skift, objekt for objekt. Du kan bruge kompilerede cmdlets til behandling eller oprette dine egne avancerede egenskaberat udføre forskellige manipulationer med objekter i pipelinen: filtrering, sortering, gruppering og endda ændring af deres struktur. Transmission af data i denne form har en alvorlig fordel: det modtagende team behøver ikke at parse bytestrømmen (tekst), al den nødvendige information hentes let ved at kalde de relevante egenskaber og metoder.

Se strukturen af ​​objekter

Lad os for eksempel køre Get-Process cmdlet'en, som giver dig mulighed for at få information om de processer, der kører i systemet:

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Det vil vise nogle formaterede tekstdata, der ikke giver nogen idé om egenskaberne for de returnerede objekter og deres metoder. For at finjustere outputtet skal vi lære at undersøge strukturen af ​​objekter, og Get-Member cmdlet'en vil hjælpe os med dette:

Get-Process | Get-Member

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Her ser vi allerede typen og strukturen, og ved hjælp af yderligere parametre kan vi for eksempel kun vise egenskaberne for det objekt, der er inkluderet i inputtet:

Get-Process | Get-Member -MemberType Property

Denne viden vil være nødvendig for at løse administrationsproblemer interaktivt eller for at skrive dine egne scripts: for eksempel for at indhente information om ophængte processer ved hjælp af egenskaben Responding.

Filtrering af objekter

PowerShell tillader objekter, der opfylder en bestemt betingelse, at blive sendt gennem en pipeline:

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

Resultatet af at udføre scriptblokken inden for parentes skal være en boolsk værdi. Hvis det er sandt ($true), vil objektet, der er input til Where-Object-cmdlet'en, blive sendt langs pipelinen, ellers ($false) vil det blive slettet. Lad os for eksempel vise en liste over stoppede Windows Server-tjenester, dvs. dem, hvis statusegenskab er indstillet til "Stoppet":

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

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Her ser vi igen en tekstlig repræsentation, men hvis du vil forstå typen og den indre struktur af de objekter, der passerer gennem rørledningen, er det ikke svært:

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

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Sortering af objekter

Ved pipelinebehandling af objekter er der ofte behov for at sortere dem. Sort-Object-cmdlet'en videregives navnene på egenskaber (sorteringsnøgler) og returnerer objekter ordnet efter deres værdier. Det er nemt at sortere output fra kørende processer efter CPU-tid brugt (cpu-egenskab):

Get-Process | Sort-Object –Property cpu

Parameteren -Property kan udelades, når du kalder Sort-Object-cmdlet'en; den bruges som standard. Til omvendt sortering skal du bruge parameteren -Descending:

Get-Process | Sort-Object cpu -Descending

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Valg af objekter og deres dele

Select-Object-cmdlet'en giver dig mulighed for at vælge et bestemt antal objekter i begyndelsen eller slutningen af ​​en pipeline ved hjælp af parametrene -First eller -Last. Med dens hjælp kan du vælge enkelte objekter eller bestemte egenskaber og også oprette nye objekter baseret på dem. Lad os se på, hvordan cmdlet'en fungerer ved hjælp af simple eksempler.

Følgende kommando viser information om de 10 processer, der bruger den maksimale mængde RAM (WS-egenskab):

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

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Du kan kun vælge bestemte egenskaber for objekter, der passerer gennem pipelinen, og oprette nye baseret på dem:

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

Som et resultat af pipelinens drift vil vi modtage et nyt objekt, hvis struktur vil adskille sig fra den struktur, der returneres af Get-Process cmdlet'en. Lad os bekræfte dette ved hjælp af Get-Member:

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

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Bemærk, at Select-Object returnerer et enkelt objekt (-First 1), der kun har to af de felter, vi specificerede: deres værdier blev kopieret fra det første objekt, der blev sendt ind i pipelinen af ​​Get-Process cmdlet'en. En af måderne at oprette objekter i PowerShell-scripts på er baseret på at bruge Select-Object:

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

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Ved hjælp af Select-Object kan du tilføje beregnede egenskaber til objekter, der skal repræsenteres som hash tabeller. I dette tilfælde svarer værdien af ​​dens første nøgle til ejendomsnavnet, og værdien af ​​den anden nøgle svarer til egenskabsværdien for det aktuelle pipeline-element:

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

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Lad os se på strukturen af ​​genstande, der passerer gennem transportøren:

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

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

ForHver-Objekt, Gruppe-Objekt og Mål-Objekt

Der er andre cmdlets til at arbejde med objekter. Lad os som et eksempel tale om de tre mest nyttige:

For hvert objekt giver dig mulighed for at køre PowerShell-kode for hvert objekt i pipelinen:

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

Gruppe-objekt grupperer objekter efter egenskabsværdi:

Group-Object PropertyName

Hvis du kører det med parameteren -NoElement, kan du finde ud af antallet af elementer i grupperne.

Mål-objekt aggregerer forskellige oversigtsparametre efter objektfeltværdier i pipelinen (beregner summen og finder også minimums-, maksimums- eller gennemsnitsværdien):

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

Typisk bruges de omtalte cmdlets interaktivt og er ofte oprettet i scripts. funktioner med start-, proces- og slutblokke.

Oprettelse af .NET- og COM-objekter (New-Object)

Der er mange softwarekomponenter med .NET Core- og COM-grænseflader, som er nyttige for systemadministratorer. Ved at bruge System.Diagnostics.EventLog-klassen kan du administrere systemlogfiler direkte fra Windows PowerShell. Lad os se på et eksempel på at oprette en forekomst af denne klasse ved hjælp af New-Object-cmdlet'en med parameteren -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Da vi ikke specificerede en specifik hændelseslog, indeholder den resulterende forekomst af klassen ingen data. For at ændre dette skal du kalde en speciel konstruktørmetode under dens oprettelse ved hjælp af parameteren -ArgumentList. Hvis vi vil have adgang til applikationsloggen, skal vi sende strengen "Application" som et argument til konstruktøren:

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

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Bemærk venligst, at vi har gemt outputtet af kommandoen i $AppLog-variablen. Selvom pipelines almindeligvis bruges i interaktiv tilstand, kræver skrivning af scripts ofte, at der vedligeholdes en reference til et objekt. Derudover er de centrale .NET Core-klasser indeholdt i systemnavnerummet: PowerShell søger som standard efter specificerede typer i det, så det er helt korrekt at skrive Diagnostics.EventLog i stedet for System.Diagnostics.EventLog.

For at arbejde med loggen kan du bruge de relevante metoder:

$AppLog | Get-Member -MemberType Method

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Lad os sige, at det ryddes af Clear()-metoden, hvis der er adgangsrettigheder:

$AppLog.Clear()

New-Object-cmdlet'en bruges også til at arbejde med COM-komponenter. Der er en hel del af dem - lige fra de biblioteker, der følger med Windows-scriptserveren til ActiveX-applikationer, såsom Internet Explorer. For at oprette et COM-objekt skal du indstille parameteren -ComObject med det programmatiske ProgId for den ønskede klasse:

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

For at skabe dine egne objekter med en vilkårlig struktur, ser brugen af ​​New-Object for arkaisk og besværligt ud; denne cmdlet bruges til at arbejde med softwarekomponenter eksternt til PowerShell. I fremtidige artikler vil dette problem blive diskuteret mere detaljeret. Udover .NET- og COM-objekter vil vi også udforske CIM (WMI) og ADSI-objekter.

Kalder statiske metoder

Nogle .NET Core-klasser kan ikke instansieres, inklusive System.Environment og System.Math. De er statisk og indeholder kun statiske egenskaber og metoder. Disse er i det væsentlige referencebiblioteker, der bruges uden at oprette objekter. Du kan henvise til en statisk klasse gennem en bogstavelig ved at sætte typenavnet i kantede parenteser. Men hvis vi ser på strukturen af ​​objektet ved hjælp af Get-Member, vil vi se typen System.RuntimeType i stedet for System.Environment:

[System.Environment] | Get-Member

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

For kun at se statiske medlemmer skal du kalde Get-Member med parameteren -Static (bemærk objekttypen):

[System.Environment] | Get-Member -Static

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

For at få adgang til statiske egenskaber og metoder skal du bruge to på hinanden følgende koloner i stedet for et punktum efter bogstavet:

[System.Environment]::OSVersion

eller

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

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Skriv PSCustomObject

Blandt de talrige datatyper, der er tilgængelige i PowerShell, er det værd at nævne PSCustomObject, designet til lagring af objekter med en vilkårlig struktur. Oprettelse af et sådant objekt ved hjælp af New-Object cmdlet betragtes som en klassisk, men besværlig og forældet måde:

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

Lad os se på objektets struktur:

$object | Get-Member

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Fra PowerShell 3.0 er en anden syntaks tilgængelig:

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

Du kan få adgang til dataene på en af ​​de tilsvarende måder:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

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

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

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

En af ulemperne ved objekter af denne type er, at rækkefølgen af ​​deres egenskaber kan ændre sig. For at undgå dette skal du bruge attributten [ordered]:

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

Der er andre muligheder for at oprette et objekt: ovenfor så vi på at bruge cmdlet'en Vælg-Objekt. Det eneste, der er tilbage, er at finde ud af at tilføje og fjerne elementer. At gøre dette for objektet fra det foregående eksempel er ret simpelt:

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

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Add-Member cmdlet'en giver dig mulighed for at tilføje ikke kun egenskaber, men også metoder til et tidligere oprettet $objekt ved at bruge "-MemberType ScriptMethod"-konstruktionen:

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

Bemærk venligst, at vi brugte $ScriptBlock-variablen af ​​typen ScriptBlock til at gemme koden til den nye metode.

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

For at fjerne egenskaber skal du bruge den tilsvarende metode:

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

Opret dine egne klasser

PowerShell 5.0 introducerede evnen til at definere karakterer ved hjælp af syntaks karakteristisk for objektorienterede programmeringssprog. Serviceordet Klasse er beregnet til dette, hvorefter du skal angive navnet på klassen og beskrive dens krop i operatørparentes:

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

Dette er en ægte .NET Core-type med en krop, der beskriver dens egenskaber, metoder og andre elementer. Lad os se på et eksempel på at definere den enkleste klasse:

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

For at oprette et objekt (klasseforekomst) skal du bruge cmdlet'en Nyt-objekt, eller et bogstav af typen [MyClass] og pseudostatisk metode ny (standard konstruktør):

$object = New-Object -TypeName MyClass

eller

$object = [MyClass]::new()

Lad os analysere objektets struktur:

$object | Get-Member

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Glem ikke omfanget: du kan ikke henvise til et typenavn som en streng eller bruge en bogstavlig type uden for scriptet eller modulet, hvor klassen er defineret. I dette tilfælde kan funktioner returnere klasseforekomster (objekter), der vil være tilgængelige uden for modulet eller scriptet.

Når du har oprettet objektet, skal du udfylde dets egenskaber:

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

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Bemærk, at klassebeskrivelsen ikke kun angiver egenskabstyperne, men også deres standardværdier:

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

Beskrivelsen af ​​en klassemetode ligner beskrivelsen af ​​en funktion, men uden brug af funktionsordet. Som i en funktion sendes parametre til metoder, hvis det er nødvendigt:

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

Nu kan repræsentanten for vores klasse smile:

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

Metoder kan være overbelastet, desuden har en klasse statiske egenskaber og metoder, samt konstruktører, hvis navne falder sammen med navnet på selve klassen. En klasse defineret i et script eller PowerShell-modul kan fungere som base for en anden - sådan implementeres arv. I dette tilfælde er det tilladt at bruge eksisterende .NET-klasser som basisklasser:

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

Vores beskrivelse af arbejdet med objekter i PowerShell er næppe udtømmende. I de følgende publikationer vil vi forsøge at uddybe det med praktiske eksempler: Den femte artikel i serien vil blive afsat til spørgsmålene om at integrere PowerShell med tredjeparts softwarekomponenter. Tidligere dele kan findes på nedenstående links.

Del 1: Grundlæggende Windows PowerShell-funktioner
Del 2: Introduktion til Windows PowerShell-programmeringssproget
Del 3: videregivelse af parametre til scripts og funktioner, oprettelse af cmdlets

Hvad er Windows PowerShell, og hvad bruges det til? Del 4: Arbejde med objekter, egne klasser

Kilde: www.habr.com

Tilføj en kommentar