Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Dalja e tekstit të komandave në dritaren e interpretuesit PowerShell është vetëm një mënyrë për të shfaqur informacionin në një formë të përshtatshme për perceptimin njerëzor. Në fakt të mërkurën i orientuar për të punuar me objekte: cmdlet dhe funksionet i marrin ato si hyrje dhe u kthye në dalje, dhe llojet e variablave të disponueshme në mënyrë interaktive dhe në skripta bazohen në klasat .NET. Në artikullin e katërt të serisë, ne do të studiojmë punën me objekte në më shumë detaje.

Përmbajtja:

Objektet në PowerShell
Shikimi i strukturës së objekteve
Filtrimi i objekteve
Renditja e objekteve
Përzgjedhja e objekteve dhe pjesëve të tyre
Përçdo-objekt, grup-objekt dhe masë-objekt
Krijimi i objekteve .NET dhe COM (New-Object)
Thirrja e metodave statike
Shkruani PSCustomObject
Krijimi i klasave tuaja

Objektet në PowerShell

Le të kujtojmë se një objekt është një koleksion fushash të dhënash (veti, ngjarje, etj.) dhe metoda për përpunimin e tyre (metoda). Struktura e tij specifikohet nga një lloj, i cili zakonisht bazohet në klasat e përdorura në platformën e unifikuar .NET Core. Është gjithashtu e mundur të punohet me objekte COM, CIM (WMI) dhe ADSI. Vetitë dhe metodat janë të nevojshme për të kryer veprime të ndryshme në të dhëna; përveç kësaj, në PowerShell, objektet mund të kalohen si argumente në funksione dhe cmdlet, t'u caktohen vlerat e tyre variablave, dhe ka gjithashtu mekanizmi i përbërjes së komandës (transportues ose tubacion). Çdo komandë në tubacion ia kalon daljen e radhës me radhë, objekt për objekt. Për përpunim, mund të përdorni cmdlet të përpiluara ose të krijoni tuajat veçori të avancuarapër të kryer manipulime të ndryshme me objektet në tubacion: filtrim, renditje, grupim, madje edhe ndryshim të strukturës së tyre. Transmetimi i të dhënave në këtë formë ka një avantazh serioz: ekipi marrës nuk ka nevojë të analizojë rrjedhën e bajtit (tekstin), i gjithë informacioni i nevojshëm merret lehtësisht duke thirrur vetitë dhe metodat e duhura.

Shikimi i strukturës së objekteve

Për shembull, le të ekzekutojmë cmdlet Get-Process, i cili ju lejon të merrni informacion në lidhje me proceset që ekzekutohen në sistem:

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Do të shfaqë disa të dhëna teksti të formatuara që nuk japin asnjë ide për vetitë e objekteve të kthyera dhe metodat e tyre. Për të rregulluar saktë daljen, duhet të mësojmë se si të ekzaminojmë strukturën e objekteve dhe cmdlet Get-Amber do të na ndihmojë për këtë:

Get-Process | Get-Member

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Këtu ne shohim tashmë llojin dhe strukturën, dhe me ndihmën e parametrave shtesë, për shembull, mund të shfaqim vetëm vetitë e objektit të përfshirë në hyrje:

Get-Process | Get-Member -MemberType Property

Kjo njohuri do të jetë e nevojshme për të zgjidhur problemet e administrimit në mënyrë interaktive ose për të shkruar skriptet tuaja: për shembull, për të marrë informacion rreth proceseve të varura duke përdorur veçorinë Përgjigje.

Filtrimi i objekteve

PowerShell lejon që objektet që plotësojnë një kusht të caktuar të kalohen përmes një tubacioni:

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

Rezultati i ekzekutimit të bllokut të skriptit brenda kllapave duhet të jetë një vlerë boolean. Nëse është e vërtetë ($true), objekti që futet në cmdlet Where-Object do të kalohet përgjatë tubacionit, përndryshe ($false) do të fshihet. Për shembull, le të shfaqim një listë të shërbimeve të ndërprera të Windows Server, d.m.th. ata, prona e Statusit të të cilëve është caktuar në "Stoped":

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Këtu përsëri shohim një paraqitje tekstuale, por nëse doni të kuptoni llojin dhe strukturën e brendshme të objekteve që kalojnë nëpër tubacion, nuk është e vështirë:

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Renditja e objekteve

Gjatë përpunimit të objekteve me tubacion, shpesh lind nevoja për t'i renditur ato. cmdlet Sort-Object i transmetohen emrat e vetive (çelësat e renditjes) dhe kthen objektet të renditura sipas vlerave të tyre. Është e lehtë të renditësh rezultatin e proceseve të ekzekutimit sipas kohës së shpenzuar të CPU-së (vetia e CPU):

Get-Process | Sort-Object –Property cpu

Parametri -Property mund të hiqet kur thirret cmdlet Sort-Object; ai përdoret si parazgjedhje. Për renditjen e kundërt, përdorni parametrin -Descending:

Get-Process | Sort-Object cpu -Descending

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Përzgjedhja e objekteve dhe pjesëve të tyre

cmdlet Select-Object ju lejon të zgjidhni një numër specifik objektesh në fillim ose në fund të një tubacioni duke përdorur parametrat -First ose -Last. Me ndihmën e tij, ju mund të zgjidhni objekte të vetme ose veti të caktuara, dhe gjithashtu të krijoni objekte të reja bazuar në to. Le të shohim se si funksionon cmdlet duke përdorur shembuj të thjeshtë.

Komanda e mëposhtme shfaq informacion në lidhje me 10 proceset që konsumojnë sasinë maksimale të RAM-it (vetia WS):

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Ju mund të zgjidhni vetëm disa veçori të objekteve që kalojnë përmes tubacionit dhe të krijoni të reja bazuar në to:

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

Si rezultat i funksionimit të tubacionit, ne do të marrim një objekt të ri, struktura e të cilit do të ndryshojë nga struktura e kthyer nga cmdlet Get-Process. Le ta verifikojmë këtë duke përdorur Get-Member:

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Vini re se Select-Object kthen një objekt të vetëm (-First 1) që ka vetëm dy nga fushat që specifikuam: vlerat e tyre u kopjuan nga objekti i parë i kaluar në tubacion nga cmdlet Get-Process. Një nga mënyrat për të krijuar objekte në skriptet PowerShell bazohet në përdorimin e Select-Object:

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Duke përdorur Select-Object, mund të shtoni vetitë e llogaritura tek objektet që duhet të paraqiten si tabela hash. Në këtë rast, vlera e çelësit të tij të parë korrespondon me emrin e pronës, dhe vlera e çelësit të dytë korrespondon me vlerën e pronës për elementin aktual të tubacionit:

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Le të shohim strukturën e objekteve që kalojnë nëpër transportues:

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Përçdo-objekt, grup-objekt dhe masë-objekt

Ka cmdlet të tjera për të punuar me objekte. Si shembull, le të flasim për tre më të dobishmet:

PërÇdo-Objekt ju lejon të ekzekutoni kodin PowerShell për çdo objekt në tubacion:

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

Grupi-Objekt grupon objektet sipas vlerës së pronës:

Group-Object PropertyName

Nëse e ekzekutoni me parametrin -NoElement, mund të zbuloni numrin e elementeve në grupe.

Masa-Objekt grumbullon parametra të ndryshëm përmbledhës sipas vlerave të fushës së objektit në tubacion (llogarit shumën dhe gjithashtu gjen vlerën minimale, maksimale ose mesatare):

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

Në mënyrë tipike, cmdlet-et e diskutuara përdoren në mënyrë interaktive dhe shpesh krijohen në skripta. funksionet me blloqet Fillimi, Procesi dhe Fundi.

Krijimi i objekteve .NET dhe COM (New-Object)

Ka shumë komponentë softuerësh me ndërfaqe .NET Core dhe COM që janë të dobishëm për administratorët e sistemit. Duke përdorur klasën System.Diagnostics.EventLog, mund të menaxhoni regjistrat e sistemit direkt nga Windows PowerShell. Le të shohim një shembull të krijimit të një shembulli të kësaj klase duke përdorur cmdlet New-Object me parametrin -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Meqenëse nuk specifikuam një regjistër të veçantë të ngjarjeve, shembulli që rezulton i klasës nuk përmban të dhëna. Për ta ndryshuar këtë, duhet të thërrisni një metodë të veçantë konstruktori gjatë krijimit të saj duke përdorur parametrin -ArgumentList. Nëse duam të hyjmë në regjistrin e aplikacionit, duhet t'ia kalojmë vargun "Application" si argument te konstruktori:

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Ju lutemi vini re se ne kemi ruajtur daljen e komandës në variablin $AppLog. Megjithëse tubacionet përdoren zakonisht në modalitetin interaktiv, shkrimi i skripteve shpesh kërkon mbajtjen e një referimi ndaj një objekti. Përveç kësaj, klasat kryesore .NET Core përmbahen në hapësirën e emrave të Sistemit: PowerShell si parazgjedhje kërkon lloje të specifikuara në të, kështu që shkrimi i Diagnostics.EventLog në vend të System.Diagnostics.EventLog është mjaft i saktë.

Për të punuar me regjistrin, mund të përdorni metodat e duhura:

$AppLog | Get-Member -MemberType Method

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Le të themi se pastrohet me metodën Clear() nëse ka të drejta aksesi:

$AppLog.Clear()

New-Object cmdlet përdoret gjithashtu për të punuar me komponentët COM. Ka shumë prej tyre - nga bibliotekat e pajisura me serverin e skripteve të Windows deri te aplikacionet ActiveX, siç është Internet Explorer. Për të krijuar një objekt COM, duhet të vendosni parametrin -ComObject me ProgId programatik të klasës së dëshiruar:

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

Për të krijuar objektet tuaja me një strukturë arbitrare, përdorimi i New-Object duket shumë arkaik dhe i rëndë; ky cmdlet përdoret për të punuar me komponentë softuerësh jashtë PowerShell. Në artikujt e ardhshëm kjo çështje do të diskutohet më në detaje. Përveç objekteve .NET dhe COM, ne do të eksplorojmë gjithashtu objektet CIM (WMI) dhe ADSI.

Thirrja e metodave statike

Disa klasa .NET Core nuk mund të instantohen, duke përfshirë System.Environment dhe System.Math. Ata janë statike dhe përmbajnë vetëm veti dhe metoda statike. Këto janë në thelb biblioteka referente që përdoren pa krijuar objekte. Ju mund t'i referoheni një klase statike përmes një literale duke mbyllur emrin e tipit në kllapa katrore. Megjithatë, nëse shikojmë strukturën e objektit duke përdorur Get-Member, do të shohim llojin System.RuntimeType në vend të System.Environment:

[System.Environment] | Get-Member

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Për të parë vetëm anëtarët statikë, thirrni Get-Member me parametrin -Static (vini re llojin e objektit):

[System.Environment] | Get-Member -Static

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Për të hyrë në vetitë dhe metodat statike, përdorni dy dy pika të njëpasnjëshme në vend të një periudhe pas fjalës së mirëfilltë:

[System.Environment]::OSVersion

ose

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Shkruani PSCustomObject

Ndër llojet e shumta të të dhënave të disponueshme në PowerShell, vlen të përmendet PSCustomObject, i krijuar për ruajtjen e objekteve me një strukturë arbitrare. Krijimi i një objekti të tillë duke përdorur cmdlet New-Object konsiderohet një mënyrë klasike, por e rëndë dhe e vjetëruar:

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

Le të shohim strukturën e objektit:

$object | Get-Member

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Duke filluar me PowerShell 3.0, një sintaksë tjetër është e disponueshme:

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

Ju mund t'i aksesoni të dhënat në një nga mënyrat ekuivalente:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Këtu është një shembull i konvertimit të një hashtable ekzistues në një objekt:

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Një nga disavantazhet e objekteve të këtij lloji është se rendi i vetive të tyre mund të ndryshojë. Për të shmangur këtë, duhet të përdorni atributin [ordered]:

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

Ekzistojnë opsione të tjera për krijimin e një objekti: më lart ne shikuam duke përdorur cmdlet Zgjidh-Objektin. Gjithçka që mbetet është të kuptojmë shtimin dhe heqjen e elementeve. Bërja e kësaj për objektin nga shembulli i mëparshëm është mjaft e thjeshtë:

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

cmdlet Add-Amber ju lejon të shtoni jo vetëm veti, por edhe metoda në një $object të krijuar më parë duke përdorur konstruktin "-MemberType ScriptMethod":

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

Ju lutemi vini re se kemi përdorur variablin $ScriptBlock të llojit ScriptBlock për të ruajtur kodin për metodën e re.

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Për të hequr vetitë, përdorni metodën përkatëse:

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

Krijimi i klasave tuaja

PowerShell 5.0 prezantoi aftësinë për të përcaktuar klasat duke përdorur karakteristikën sintaksore të gjuhëve programuese të orientuara nga objekti. Fjala e shërbimit Class është menduar për këtë, pas së cilës duhet të specifikoni emrin e klasës dhe të përshkruani trupin e saj në kllapat e operatorit:

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

Ky është një lloj i vërtetë .NET Core, me një trup që përshkruan vetitë, metodat dhe elementët e tjerë të tij. Le të shohim një shembull të përcaktimit të klasës më të thjeshtë:

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

Për të krijuar një objekt (një shembull i klasës), përdorni cmdlet Objekt i ri, ose një fjalë për fjalë të tipit [MyClass] dhe metodë pseudostatike i ri (ndërtuesi i parazgjedhur):

$object = New-Object -TypeName MyClass

ose

$object = [MyClass]::new()

Le të analizojmë strukturën e objektit:

$object | Get-Member

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Mos harroni për shtrirjen: nuk mund t'i referoheni emrit të llojit si varg ose të përdorni një lloj literal jashtë skriptit ose modulit në të cilin është përcaktuar klasa. Në këtë rast, funksionet mund të kthejnë instancat e klasës (objektet) që do të jenë të aksesueshme jashtë modulit ose skriptit.

Pas krijimit të objektit, plotësoni vetitë e tij:

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Vini re se përshkrimi i klasës specifikon jo vetëm llojet e vetive, por edhe vlerat e tyre të paracaktuara:

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

Përshkrimi i një metode të klasës i ngjan përshkrimit të një funksioni, por pa përdorur fjalën e funksionit. Si në një funksion, parametrat i kalohen metodave nëse është e nevojshme:

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

Tani përfaqësuesi i klasës sonë mund të buzëqeshë:

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

Metodat mund të mbingarkohen; përveç kësaj, një klasë ka vetitë dhe metodat statike, si dhe konstruktorë, emrat e të cilëve përkojnë me emrin e vetë klasës. Një klasë e përcaktuar në një skript ose modul PowerShell mund të shërbejë si bazë për një tjetër - kështu zbatohet trashëgimia. Në këtë rast, lejohet përdorimi i klasave ekzistuese .NET si ato bazë:

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

Përshkrimi ynë i punës me objekte në PowerShell nuk është pothuajse shterues. Në botimet e mëposhtme do të përpiqemi ta thellojmë me shembuj praktikë: artikulli i pestë i serisë do t'i kushtohet çështjeve të integrimit të PowerShell me komponentët e softuerit të palëve të treta. Pjesët e kaluara mund të gjenden në lidhjet e mëposhtme.

Pjesa 1: Karakteristikat themelore të Windows PowerShell
Pjesa 2: Hyrje në gjuhën e programimit Windows PowerShell
Pjesa 3: kalimi i parametrave te skriptet dhe funksionet, krijimi i cmdlets

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 4: Puna me objekte, klasat e veta

Burimi: www.habr.com

Shto një koment