Tekstutgangen til kommandoer i PowerShell-tolkvinduet er bare en måte å vise informasjon på i en form som passer for menneskelig oppfatning. Faktisk onsdag
Bekreftelse:
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å
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:
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
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"}
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
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
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
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
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()
Ved å bruke Select-Object kan du legge til beregnede egenskaper til objekter som må representeres som
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
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
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.
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
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
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
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
[System.Environment] | Get-Member
For å se kun statiske medlemmer, ring Get-Member med parameteren -Static (merk objekttypen):
[System.Environment] | Get-Member -Static
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()
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
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()
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
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
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.
For å fjerne egenskaper, bruk den tilsvarende metoden:
$object.psobject.properties.remove('Name')
Lag dine egne klasser
PowerShell 5.0 introduserte muligheten til å definere
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
$object = New-Object -TypeName MyClass
eller
$object = [MyClass]::new()
La oss analysere strukturen til objektet:
$object | Get-Member
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
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
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.
Kilde: www.habr.com