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
Indholdsfortegnelse:
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å
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:
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
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"}
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
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
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
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
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()
Ved hjælp af Select-Object kan du tilføje beregnede egenskaber til objekter, der skal repræsenteres som
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
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
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.
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
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
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
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
[System.Environment] | Get-Member
For kun at se statiske medlemmer skal du kalde Get-Member med parameteren -Static (bemærk objekttypen):
[System.Environment] | Get-Member -Static
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()
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
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()
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
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
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.
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
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
$object = New-Object -TypeName MyClass
eller
$object = [MyClass]::new()
Lad os analysere objektets struktur:
$object | Get-Member
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
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
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.
Kilde: www.habr.com