Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Ang text output sa mga command sa PowerShell interpreter window kay usa lang ka paagi sa pagpakita sa impormasyon sa porma nga haom sa panglantaw sa tawo. Sa tinuod Miyerkules oriented sa pagtrabaho uban sa mga butang: cmdlets ug mga gimbuhaton makadawat kanila ingon nga input ug nibalik sa exit, ug ang mga variable nga tipo nga magamit nga interactive ug sa mga script gibase sa .NET nga mga klase. Sa ikaupat nga artikulo sa serye, atong tun-an ang pagtrabaho sa mga butang nga mas detalyado.

Talaan sa mga sulod:

Mga butang sa PowerShell
Pagtan-aw sa istruktura sa mga butang
Pagsala sa mga butang
Paghan-ay sa mga butang
Pagpili sa mga butang ug sa ilang mga bahin
Alang sa Matag-Buhat, Grupo-Buhat ug Sukdanan-Buhat
Paghimo og .NET ug COM nga mga butang (Bag-ong butang)
Pagtawag sa Static Methods
I-type ang PSCustomObject
Paghimo sa Imong Kaugalingong mga Klase

Mga butang sa PowerShell

Atong hinumdoman nga ang usa ka butang usa ka koleksyon sa mga natad sa datos (mga kabtangan, panghitabo, ug uban pa) ug mga pamaagi sa pagproseso niini (mga pamaagi). Ang istruktura niini gipiho sa usa ka tipo, nga kasagaran gibase sa mga klase nga gigamit sa hiniusang .NET Core nga plataporma. Posible usab nga magtrabaho sa COM, CIM (WMI) ug ADSI nga mga butang. Ang mga kabtangan ug pamaagi gikinahanglan aron mahimo ang lainlaing mga aksyon sa datos; dugang pa, sa PowerShell, ang mga butang mahimong ipasa ingon mga argumento sa mga gimbuhaton ug cmdlet, gi-assign ang ilang mga kantidad sa mga variable, ug adunay usab mekanismo sa komposisyon sa mando (conveyor o pipeline). Ang matag command sa pipeline nagpasa sa iyang output ngadto sa sunod nga usa sa turno, butang sa butang. Alang sa pagproseso, mahimo nimong gamiton ang gihugpong nga mga cmdlet o paghimo og imong kaugalingon abante nga mga bahinsa paghimo sa lain-laing mga manipulasyon sa mga butang sa pipeline: pagsala, paghan-ay, paggrupo, ug bisan sa pag-usab sa ilang mga gambalay. Ang pagpadala sa datos niini nga porma adunay seryoso nga bentaha: ang nakadawat nga grupo dili kinahanglan nga mag-parse sa byte stream (text), ang tanan nga gikinahanglan nga impormasyon dali nga makuha pinaagi sa pagtawag sa angay nga mga kabtangan ug mga pamaagi.

Pagtan-aw sa istruktura sa mga butang

Pananglitan, atong padaganon ang Get-Process cmdlet, nga nagtugot kanimo nga makakuha og impormasyon bahin sa mga proseso nga nagdagan sa sistema:

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Kini magpakita sa pipila ka na-format nga datos sa teksto nga wala maghatag ug bisan unsa nga ideya mahitungod sa mga kabtangan sa gibalik nga mga butang ug sa ilang mga pamaagi. Aron mamaayo ang output, kinahanglan natong makat-on unsaon pagsusi sa istruktura sa mga butang, ug ang Get-Member cmdlet makatabang kanato niini:

Get-Process | Get-Member

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Dinhi nakita na nato ang tipo ug estraktura, ug sa tabang sa dugang nga mga parametro mahimo natong, pananglitan, ipakita lamang ang mga kabtangan sa butang nga gilakip sa input:

Get-Process | Get-Member -MemberType Property

Kini nga kahibalo gikinahanglan aron masulbad ang mga problema sa administrasyon nga interactive o sa pagsulat sa imong kaugalingon nga mga script: pananglitan, aron makakuha og impormasyon bahin sa gibitay nga mga proseso gamit ang Responding property.

Pagsala sa mga butang

Gitugotan sa PowerShell ang mga butang nga nakab-ot sa usa ka piho nga kondisyon nga ipasa sa usa ka pipeline:

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

Ang resulta sa pagpatuman sa script block sulod sa mga parentesis kinahanglang boolean value. Kung kini tinuod ($ tinuod), ang butang nga gi-input sa Where-Object cmdlet ipasa sa pipeline, kung dili ($ bakak) kini mapapas. Pananglitan, ipakita nato ang usa ka lista sa nahunong nga mga serbisyo sa Windows Server, i.e. kadtong kansang Status nga kabtangan gitakda sa "Nahunong":

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

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Dinhi pag-usab atong makita ang usa ka representasyon sa teksto, apan kung gusto nimong masabtan ang tipo ug internal nga istruktura sa mga butang nga moagi sa pipeline dili kini lisud:

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

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Paghan-ay sa mga butang

Kung ang pagproseso sa pipeline sa mga butang, kanunay kinahanglan nga ihan-ay kini. Ang Sort-Object cmdlet gipasa ang mga ngalan sa mga kabtangan (pagsunud sa mga yawe) ug gibalik ang mga butang nga gi-order sa ilang mga kantidad. Sayon ang paghan-ay sa output sa mga proseso sa pagpadagan sa oras nga gigugol sa CPU (cpu property):

Get-Process | Sort-Object –Property cpu

Ang -Property parameter mahimong dili iapil sa pagtawag sa Sort-Object cmdlet; kini gigamit sa default. Para sa reverse sorting, gamita ang -Descending parameter:

Get-Process | Sort-Object cpu -Descending

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Pagpili sa mga butang ug sa ilang mga bahin

Ang Select-Object cmdlet nagtugot kanimo sa pagpili sa usa ka piho nga gidaghanon sa mga butang sa sinugdanan o katapusan sa usa ka pipeline gamit ang -First o -Last parameters. Uban sa tabang niini, mahimo nimong pilion ang usa ka butang o piho nga mga kabtangan, ug maghimo usab mga bag-ong butang nga gibase niini. Atong tan-awon kung giunsa paglihok ang cmdlet gamit ang yano nga mga pananglitan.

Ang mosunod nga sugo nagpakita sa impormasyon mahitungod sa 10 ka proseso nga nag-ut-ot sa kinatas-ang gidaghanon sa RAM (WS property):

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

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Makapili ka lamang sa pipila ka mga kabtangan sa mga butang nga moagi sa pipeline ug maghimo og mga bag-o base niini:

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

Ingon usa ka sangputanan sa operasyon sa pipeline, makadawat kami usa ka bag-ong butang, ang istruktura nga lahi sa istruktura nga gibalik sa Get-Process cmdlet. Atong pamatud-an kini gamit ang Get-Member:

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

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Timan-i nga ang Select-Object nagbalik sa usa ka butang (-Una 1) nga adunay duha ra sa mga natad nga among gitakda: ang ilang mga kantidad gikopya gikan sa una nga butang nga gipasa sa pipeline sa Get-Process cmdlet. Usa sa mga paagi sa paghimo og mga butang sa mga script sa PowerShell gibase sa paggamit sa Select-Object:

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

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Gamit ang Select-Object, mahimo nimong idugang ang nakalkula nga mga kabtangan sa mga butang nga kinahanglan irepresentar ingon hash nga mga lamesa. Sa kini nga kaso, ang kantidad sa una nga yawe katumbas sa ngalan sa kabtangan, ug ang kantidad sa ikaduha nga yawe katumbas sa kantidad sa kabtangan alang sa karon nga elemento sa pipeline:

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

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Atong tan-awon ang istruktura sa mga butang nga moagi sa conveyor:

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

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Alang sa Matag-Buhat, Grupo-Buhat ug Sukdanan-Buhat

Adunay uban nga mga cmdlet alang sa pagtrabaho sa mga butang. Ingong pananglitan, atong hisgotan ang tulo ka labing mapuslanon:

Alang sa Matag-Buhat nagtugot kanimo sa pagpadagan sa PowerShell code alang sa matag butang sa pipeline:

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

Grupo-Buhat grupo sa mga butang pinaagi sa bili sa kabtangan:

Group-Object PropertyName

Kung gipadagan nimo kini gamit ang -NoElement parameter, mahibal-an nimo ang gidaghanon sa mga elemento sa mga grupo.

Sukdanan-Buhat nag-aggregate sa nagkalain-laing mga summary parameters pinaagi sa object field values ​​sa pipeline (gikalkula ang sum, ug nakit-an usab ang minimum, maximum o average value):

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

Kasagaran, ang mga cmdlet nga gihisgutan gigamit nga interactive, ug sagad gihimo sa mga script. gimbuhaton uban sa Pagsugod, Proseso ug Katapusan nga mga bloke.

Paghimo og .NET ug COM nga mga butang (Bag-ong butang)

Adunay daghang mga sangkap sa software nga adunay mga interface sa .NET Core ug COM nga mapuslanon sa mga tigdumala sa sistema. Gamit ang System.Diagnostics.EventLog nga klase, mahimo nimong madumala ang mga log sa sistema direkta gikan sa Windows PowerShell. Atong tan-awon ang usa ka pananglitan sa paghimo sa usa ka pananglitan niini nga klase gamit ang New-Object cmdlet nga adunay -TypeName parameter:

New-Object -TypeName System.Diagnostics.EventLog

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Tungod kay wala kami nagtino sa usa ka piho nga log sa panghitabo, ang resulta nga pananglitan sa klase wala’y datos. Aron mabag-o kini, kinahanglan nimo nga tawagan ang usa ka espesyal nga pamaagi sa pagtukod sa panahon sa paghimo niini gamit ang parameter -ArgumentList. Kung gusto namon nga ma-access ang log sa aplikasyon, kinahanglan namon nga ipasa ang string nga "Application" ingon usa ka argumento sa nagtukod:

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

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Palihug timan-i nga among gitipigan ang output sa sugo sa $AppLog variable. Bisan tuod ang mga pipeline kasagarang gigamit sa interactive nga paagi, ang pagsulat sa mga script kasagaran nagkinahanglan sa pagpadayon sa usa ka reperensiya sa usa ka butang. Dugang pa, ang kinauyokan nga .NET Core nga mga klase anaa sa System namespace: Ang PowerShell pinaagi sa default nangita sa mga espesipikong tipo niini, mao nga husto ang pagsulat sa Diagnostics.EventLog imbes sa System.Diagnostics.EventLog.

Aron magamit ang log, mahimo nimong gamiton ang angay nga mga pamaagi:

$AppLog | Get-Member -MemberType Method

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Ingnon ta nga kini gi-clear sa Clear() nga pamaagi kung adunay mga katungod sa pag-access:

$AppLog.Clear()

Ang New-Object cmdlet gigamit usab sa pagtrabaho uban sa COM components. Adunay daghan niini - gikan sa mga librarya nga gihatag sa Windows script server hangtod sa mga aplikasyon sa ActiveX, sama sa Internet Explorer. Aron makahimo og COM nga butang, kinahanglan nimo nga itakda ang -ComObject nga parameter gamit ang programmatic ProgId sa gusto nga klase:

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

Aron makamugna og kaugalingon nimong mga butang nga adunay arbitraryong estraktura, ang paggamit sa New-Object morag karaan ug hago kaayo; kini nga cmdlet kay gigamit sa pagtrabaho sa mga software component gawas sa PowerShell. Sa umaabot nga mga artikulo kini nga isyu hisgotan sa mas detalyado. Dugang sa .NET ug COM nga mga butang, kita usab mag-usisa sa CIM (WMI) ug ADSI nga mga butang.

Pagtawag sa Static Methods

Ang ubang .NET Core nga mga klase dili mahimong instantiated, lakip ang System.Environment ug System.Math. Sila mao static ug naglangkob lamang sa static nga mga kabtangan ug mga pamaagi. Kini sa esensya nga mga librarya sa pakisayran nga gigamit nga wala maghimo mga butang. Mahimo nimong i-refer ang usa ka static nga klase pinaagi sa usa ka literal pinaagi sa paglakip sa tipo nga ngalan sa square bracket. Apan, kung atong tan-awon ang istruktura sa butang gamit ang Get-Member, atong makita ang tipo nga System.RuntimeType imbes nga System.Environment:

[System.Environment] | Get-Member

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Para tan-awon lang ang mga static nga miyembro, tawga ang Get-Member gamit ang -Static parameter (timan-i ang tipo sa butang):

[System.Environment] | Get-Member -Static

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Aron ma-access ang static nga mga kabtangan ug mga pamaagi, gamita ang duha ka magkasunod nga colon imbes nga usa ka tuldok pagkahuman sa literal:

[System.Environment]::OSVersion

O

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

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

I-type ang PSCustomObject

Taliwala sa daghang mga tipo sa datos nga magamit sa PowerShell, angay nga hisgutan ang PSCustomObject, nga gidisenyo alang sa pagtipig sa mga butang nga adunay usa ka arbitraryong istruktura. Ang paghimo sa ingon nga butang gamit ang New-Object cmdlet giisip nga usa ka klasiko, apan lisud ug karaan nga paagi:

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

Atong tan-awon ang istruktura sa butang:

$object | Get-Member

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Sugod sa PowerShell 3.0, laing syntax ang anaa:

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

Mahimo nimong ma-access ang datos sa usa sa parehas nga mga paagi:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Ania ang usa ka pananglitan sa pag-convert sa usa ka kasamtangan nga hashtable ngadto sa usa ka butang:

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

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Usa sa mga disadvantages sa mga butang sa niini nga matang mao nga ang han-ay sa ilang mga kabtangan mahimong mausab. Aron malikayan kini, kinahanglan nimong gamiton ang [gimando] nga hiyas:

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

Adunay uban nga mga kapilian sa paghimo sa usa ka butang: sa ibabaw gitan-aw namon ang paggamit sa cmdlet Pagpili-Bag-o. Ang nahabilin mao ang paghunahuna sa pagdugang ug pagtangtang sa mga elemento. Ang pagbuhat niini alang sa butang gikan sa miaging pananglitan yano ra:

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

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Ang Add-Member cmdlet nagtugot kanimo sa pagdugang dili lamang sa mga kabtangan, apan usab sa mga pamaagi sa usa ka nabuhat kaniadto nga $object pinaagi sa paggamit sa "-MemberType ScriptMethod" nga pagtukod:

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

Palihug timan-i nga among gigamit ang $ScriptBlock variable sa tipo nga ScriptBlock aron tipigan ang code para sa bag-ong pamaagi.

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Aron makuha ang mga kabtangan, gamita ang katugbang nga pamaagi:

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

Paghimo sa Imong Kaugalingong mga Klase

Gipaila sa PowerShell 5.0 ang abilidad sa paghubit mga grado gamit ang syntax nga kinaiya sa object-oriented programming language. Ang serbisyo nga pulong nga Klase gituyo alang niini, pagkahuman kinahanglan nimo nga ipiho ang ngalan sa klase ug ihulagway ang lawas niini sa mga bracket sa operator:

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

Kini usa ka tinuod nga .NET Core nga tipo, nga adunay lawas nga naghulagway sa mga kabtangan niini, mga pamaagi, ug uban pang mga elemento. Atong tan-awon ang usa ka pananglitan sa paghubit sa pinakasimple nga klase:

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

Aron makahimo usa ka butang (klase nga pananglitan), gamita ang cmdlet Bag-ong-Buhat, o usa ka literal nga tipo [MyClass] ug pseudostatic nga pamaagi bag-o (default constructor):

$object = New-Object -TypeName MyClass

o

$object = [MyClass]::new()

Atong analisahon ang istruktura sa butang:

$object | Get-Member

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Ayaw kalimti ang bahin sa kasangkaran: dili ka mahimong magtumong sa usa ka tipo nga ngalan ingon usa ka hilo o mogamit usa ka tipo nga literal sa gawas sa script o module diin gihubit ang klase. Sa kini nga kaso, ang mga gimbuhaton mahimo’g ibalik ang mga higayon sa klase (mga butang) nga ma-access sa gawas sa module o script.

Human sa paghimo sa butang, pun-a ang mga kabtangan niini:

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

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Timan-i nga ang deskripsyon sa klase nagtino dili lamang sa mga tipo sa kabtangan, apan usab sa ilang mga default nga kantidad:

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

Ang paghulagway sa usa ka pamaagi sa klase susama sa paghulagway sa usa ka function, apan wala gamita ang function nga pulong. Sama sa usa ka function, ang mga parameter gipasa sa mga pamaagi kung kinahanglan:

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

Karon ang representante sa among klase makapahiyom:

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

Ang mga pamaagi mahimong ma-overload; dugang pa, ang usa ka klase adunay static nga mga kabtangan ug pamaagi, ingon man mga konstruktor kansang mga ngalan nahiuyon sa ngalan sa klase mismo. Ang usa ka klase nga gihubit sa usa ka script o PowerShell module mahimong magsilbi nga sukaranan alang sa lain - ingon niini kung giunsa ipatuman ang kabilin. Sa kini nga kaso, gitugotan ang paggamit sa naa na nga .NET nga mga klase ingon nga base:

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

Ang among paghulagway sa pagtrabaho sa mga butang sa PowerShell halos dili kompleto. Sa mosunod nga mga publikasyon, atong sulayan ang pagpalawom niini gamit ang praktikal nga mga pananglitan: ang ikalima nga artikulo sa serye igahin sa mga isyu sa pag-integrate sa PowerShell sa mga third-party nga software component. Ang nangaging mga bahin makita sa mga link sa ubos.

Bahin 1: Basic Windows PowerShell Features
Bahin 2: Pasiuna sa Windows PowerShell Programming Language
Bahin 3: pagpasa sa mga parameter sa mga script ug mga gimbuhaton, paghimo sa mga cmdlet

Unsa ang Windows PowerShell ug alang sa unsa kini gigamit? Bahin 4: Pagtrabaho sa mga butang, kaugalingong mga klase

Source: www.habr.com

Idugang sa usa ka comment