X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

L-output tat-test tal-kmandi fit-tieqa tal-interpretu PowerShell huwa biss mod kif turi l-informazzjoni f'forma adattata għall-perċezzjoni umana. Attwalment l-Erbgħa orjentat biex taħdem ma 'oġġetti: cmdlets u funzjonijiet jirċievuhom bħala input u lura fil-ħruġ, u t-tipi varjabbli disponibbli b'mod interattiv u fi skripts huma bbażati fuq klassijiet .NET. Fir-raba 'artiklu tas-serje, se nistudjaw ix-xogħol ma' oġġetti f'aktar dettall.

Werrej:

Oġġetti fil-PowerShell
Ara l-istruttura ta 'oġġetti
Iffiltrar ta' oġġetti
Issortjar oġġetti
Għażla ta' oġġetti u l-partijiet tagħhom
GħalKull-Oġġett, Grupp-Oġġett u Miżura-Oġġett
Il-ħolqien ta' oġġetti .NET u COM (Oġġett Ġdid)
Sejħa metodi statiċi
Ittajpja PSCustomObject
Ħolqien tal-Klassijiet Tiegħek

Oġġetti fil-PowerShell

Ejja nfakkru li oġġett huwa ġabra ta 'oqsma tad-dejta (proprjetajiet, avvenimenti, eċċ.) u metodi għall-ipproċessar tagħhom (metodi). L-istruttura tagħha hija speċifikata minn tip, li normalment ikun ibbażat fuq klassijiet użati fil-pjattaforma unifikata .NET Core. Huwa wkoll possibbli li taħdem ma 'oġġetti COM, CIM (WMI) u ADSI. Proprjetajiet u metodi huma meħtieġa biex jitwettqu diversi azzjonijiet fuq id-dejta; barra minn hekk, f'PowerShell, l-oġġetti jistgħu jiġu mgħoddija bħala argumenti għal funzjonijiet u cmdlets, assenjati l-valuri tagħhom għal varjabbli, u hemm ukoll mekkaniżmu tal-kompożizzjoni tal-kmand (conveyor jew pipeline). Kull kmand fil-pipeline jgħaddi l-output tiegħu lil dak li jmiss min-naħa tiegħu, oġġett b'oġġett. Għall-ipproċessar, tista 'tuża cmdlets ikkumpilati jew toħloq tiegħek karatteristiċi avvanzatibiex twettaq diversi manipulazzjonijiet ma 'oġġetti fil-pipeline: filtrazzjoni, għażla, raggruppament, u anke tibdil tal-istruttura tagħhom. It-trażmissjoni tad-dejta f'din il-forma għandha vantaġġ serju: it-tim li jirċievi m'għandux għalfejn jinnaliża l-fluss tal-byte (test), l-informazzjoni kollha meħtieġa tinġabar faċilment billi ssejjaħ il-proprjetajiet u l-metodi xierqa.

Ara l-istruttura ta 'oġġetti

Pereżempju, ejja nħaddmu ċ-cmdlet Get-Process, li jippermettilek tikseb informazzjoni dwar il-proċessi li qed jaħdmu fis-sistema:

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Se juri xi dejta tat-test ifformattjata li ma tagħti l-ebda idea dwar il-proprjetajiet tal-oġġetti rritornati u l-metodi tagħhom. Biex nirfinaw l-output, irridu nitgħallmu kif neżaminaw l-istruttura tal-oġġetti, u l-cmdlet Get-Member jgħinna f'dan:

Get-Process | Get-Member

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Hawnhekk diġà naraw it-tip u l-istruttura, u bl-għajnuna ta 'parametri addizzjonali nistgħu, pereżempju, nuru biss il-proprjetajiet tal-oġġett inkluż fl-input:

Get-Process | Get-Member -MemberType Property

Dan l-għarfien se jkun meħtieġ biex issolvi problemi ta’ amministrazzjoni b’mod interattiv jew biex tikteb l-iskripts tiegħek stess: pereżempju, biex tikseb informazzjoni dwar proċessi mdendlin bl-użu tal-proprjetà Rispondi.

Iffiltrar ta' oġġetti

PowerShell jippermetti li oġġetti li jissodisfaw ċerta kundizzjoni jgħaddu minn pipeline:

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

Ir-riżultat tal-eżekuzzjoni tal-blokk tal-iskript fil-parentesi għandu jkun valur boolean. Jekk huwa veru ($true), l-oġġett li jiddaħħal fis-cmdlet Where-Object se jiġi mgħoddi tul il-pipeline, inkella ($false) jitħassar. Pereżempju, ejja nuru lista ta’ servizzi tal-Windows Server waqfien, i.e. dawk li l-proprjetà ta' l-Istatus tagħhom hija ssettjata bħala "Imwaqqaf":

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

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Hawnhekk għal darb'oħra naraw rappreżentazzjoni testwali, imma jekk trid tifhem it-tip u l-istruttura interna tal-oġġetti li jgħaddu mill-pipeline mhuwiex diffiċli:

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

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Issortjar oġġetti

Meta l-ipproċessar tal-pipeline ta 'oġġetti, ħafna drabi jkun hemm bżonn li jiġu ssortjati. Is-cmdlet Sort-Object jgħaddi l-ismijiet tal-proprjetajiet (issortjar ċwievet) u jirritorna oġġetti ordnati mill-valuri tagħhom. Huwa faċli li tissortja l-output tal-proċessi li qed jaħdmu skont il-ħin tas-CPU mgħoddi (proprjetà tas-cpu):

Get-Process | Sort-Object –Property cpu

Il-parametru -Property jista' jitħalla barra meta ssejjaħ is-cmdlet Sort-Object; jintuża b'mod awtomatiku. Għall-issortjar b'lura, uża l-parametru -Dixxendenti:

Get-Process | Sort-Object cpu -Descending

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Għażla ta' oġġetti u l-partijiet tagħhom

Il-cmdlet Select-Object jippermettilek tagħżel numru speċifiku ta 'oġġetti fil-bidu jew fit-tmiem ta' pipeline billi tuża l-parametri -First jew -Last. Bl-għajnuna tagħha, tista 'tagħżel oġġetti singoli jew ċerti proprjetajiet, u toħloq ukoll oġġetti ġodda bbażati fuqhom. Ejja nħarsu lejn kif jaħdem is-cmdlet billi tuża eżempji sempliċi.

Il-kmand li ġej juri informazzjoni dwar l-10 proċessi li jikkunsmaw l-ammont massimu ta 'RAM (proprjetà WS):

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

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Tista 'tagħżel biss ċerti proprjetajiet ta' oġġetti li jgħaddu mill-pipeline u toħloq oħrajn ġodda bbażati fuqhom:

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

Bħala riżultat tat-tħaddim tal-pipeline, se nirċievu oġġett ġdid, li l-istruttura tiegħu tkun differenti mill-istruttura rritornata mill-cmdlet Get-Process. Ejja nivverifikaw dan billi tuża Get-Member:

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

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Innota li Select-Object jirritorna oġġett wieħed (-First 1) li għandu biss tnejn mill-oqsma li speċifikajna: il-valuri tagħhom ġew ikkupjati mill-ewwel oġġett mgħoddi fil-pipeline mill-cmdlet Get-Process. Wieħed mill-modi biex jinħolqu oġġetti fl-iskripts PowerShell huwa bbażat fuq l-użu Select-Object:

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

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Billi tuża Agħżel-Oġġett, tista 'żżid proprjetajiet ikkalkulati ma' oġġetti li jeħtieġ li jiġu rappreżentati bħala imwejjed tal-hash. F'dan il-każ, il-valur tal-ewwel ċavetta tiegħu jikkorrispondi għall-isem tal-proprjetà, u l-valur tat-tieni ċavetta jikkorrispondi għall-valur tal-proprjetà għall-element tal-pipeline attwali:

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

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Ejja nħarsu lejn l-istruttura ta 'oġġetti li jgħaddu mill-conveyor:

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

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

GħalKull-Oġġett, Grupp-Oġġett u Miżura-Oġġett

Hemm cmdlets oħra biex taħdem ma 'oġġetti. Bħala eżempju, ejja nitkellmu dwar it-tliet l-aktar utli:

GħalKull-Oġġett jippermettilek tmexxi kodiċi PowerShell għal kull oġġett fil-pipeline:

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

Grupp-Oġġett jiġbor l-oġġetti skont il-valur tal-proprjetà:

Group-Object PropertyName

Jekk tmexxiha bil-parametru -NoElement, tista 'ssir taf in-numru ta' elementi fil-gruppi.

Miżura-Oġġett jaggrega diversi parametri fil-qosor skont il-valuri tal-kamp tal-oġġett fil-pipeline (jikkalkula s-somma, u ssib ukoll il-valur minimu, massimu jew medju):

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

Tipikament, is-cmdlets diskussi jintużaw b'mod interattiv, u ħafna drabi jinħolqu fi skripts. funzjonijiet bi blokki Bidu, Proċess u Tmiem.

Il-ħolqien ta' oġġetti .NET u COM (Oġġett Ġdid)

Hemm ħafna komponenti tas-softwer b'interfaces .NET Core u COM li huma utli għall-amministraturi tas-sistema. Bl-użu tal-klassi System.Diagnostics.EventLog, tista' timmaniġġja r-reġistri tas-sistema direttament minn Windows PowerShell. Ejja nħarsu lejn eżempju tal-ħolqien ta 'istanza ta' din il-klassi bl-użu tas-cmdlet New-Object bil-parametru -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Peress li aħna ma speċifikajna log ta 'avvenimenti speċifiċi, l-istanza li tirriżulta tal-klassi ma fiha l-ebda dejta. Biex tibdel dan, għandek bżonn issejjaħ metodu kostruttur speċjali waqt il-ħolqien tiegħu billi tuża l-parametru -ArgumentList. Jekk irridu naċċessaw ir-reġistru tal-applikazzjoni, għandna ngħaddu s-sekwenza "Applikazzjoni" bħala argument lill-kostruttur:

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

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Jekk jogħġbok innota li ssejvjajna l-output tal-kmand fil-varjabbli $AppLog. Għalkemm il-pipelines huma komunement użati fil-mod interattiv, il-kitba ta 'skripts ħafna drabi teħtieġ iż-żamma ta' referenza għal oġġett. Barra minn hekk, il-klassijiet ewlenin .NET Core jinsabu fl-ispazju tal-isem tas-Sistema: PowerShell awtomatikament ifittex tipi speċifikati fih, għalhekk il-kitba Diagnostics.EventLog minflok System.Diagnostics.EventLog hija pjuttost korretta.

Biex taħdem mal-log, tista 'tuża l-metodi xierqa:

$AppLog | Get-Member -MemberType Method

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Ejja ngħidu li hija approvata bil-metodu Clear() jekk hemm drittijiet ta 'aċċess:

$AppLog.Clear()

Il-cmdlet New-Object jintuża wkoll biex jaħdem mal-komponenti COM. Hemm ħafna minnhom - mil-libreriji fornuti mas-server tal-iskript tal-Windows għal applikazzjonijiet ActiveX, bħall-Internet Explorer. Biex toħloq oġġett COM, trid issettja l-parametru -ComObject bil-ProgId programmatiku tal-klassi mixtieqa:

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

Biex toħloq l-oġġetti tiegħek bi struttura arbitrarja, l-użu ta' New-Object jidher wisq arkajku u ingombranti; dan is-cmdlet jintuża biex jaħdem ma' komponenti ta' softwer esterni għal PowerShell. F'artikli futuri din il-kwistjoni se tiġi diskussa f'aktar dettall. Minbarra l-oġġetti .NET u COM, se nesploraw ukoll oġġetti CIM (WMI) u ADSI.

Sejħa metodi statiċi

Xi klassijiet .NET Core ma jistgħux jiġu instanzjati, inklużi System.Environment u System.Math. Huma statiku u fihom biss proprjetajiet u metodi statiċi. Dawn huma essenzjalment libreriji ta' referenza li jintużaw mingħajr ma jinħolqu oġġetti. Tista' tirreferi għal klassi statika permezz ta' letterali billi tagħlaq l-isem tat-tip fil-parentesi kwadri. Madankollu, jekk inħarsu lejn l-istruttura tal-oġġett billi tuża Get-Member, naraw it-tip System.RuntimeType minflok System.Environment:

[System.Environment] | Get-Member

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Biex tara membri statiċi biss, ċempel Get-Member bil-parametru -Static (innota t-tip ta' oġġett):

[System.Environment] | Get-Member -Static

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Biex taċċessa proprjetajiet u metodi statiċi, uża żewġ punti konsekuttivi minflok perjodu wara l-litterali:

[System.Environment]::OSVersion

Jew

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

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Ittajpja PSCustomObject

Fost il-bosta tipi ta 'dejta disponibbli fil-PowerShell, ta' min isemmi PSCustomObject, iddisinjat għall-ħażna ta 'oġġetti bi struttura arbitrarja. Il-ħolqien ta' oġġett bħal dan bl-użu tas-cmdlet New-Object huwa meqjus bħala mod klassiku, iżda diffiċli u skadut:

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

Ejja nħarsu lejn l-istruttura tal-oġġett:

$object | Get-Member

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Nibda minn PowerShell 3.0, hija disponibbli sintassi oħra:

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

Tista' taċċessa d-dejta b'wieħed mill-modi ekwivalenti:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Hawn eżempju ta 'konverżjoni ta' hashtable eżistenti għal oġġett:

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

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Wieħed mill-iżvantaġġi ta 'oġġetti ta' dan it-tip huwa li l-ordni tal-proprjetajiet tagħhom tista 'tinbidel. Biex tevita dan, trid tuża l-attribut [ordnat]:

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

Hemm għażliet oħra għall-ħolqien ta 'oġġett: hawn fuq ħares lejn l-użu tas-cmdlet Oġġett Magħżul. Kulma jibqa 'huwa li nsib li żżid u tneħħi elementi. Li tagħmel dan għall-oġġett mill-eżempju preċedenti hija pjuttost sempliċi:

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

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Is-cmdlet Add-Member jippermettilek li żżid mhux biss proprjetajiet, iżda wkoll metodi għal $oġġett maħluq qabel billi tuża l-kostruzzjoni "-MemberType ScriptMethod":

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

Jekk jogħġbok innota li użajna l-varjabbli $ScriptBlock tat-tip ScriptBlock biex naħżnu l-kodiċi għall-metodu l-ġdid.

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Biex tneħħi l-proprjetajiet, uża l-metodu korrispondenti:

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

Ħolqien tal-Klassijiet Tiegħek

PowerShell 5.0 introduċa l-abbiltà li tiddefinixxi klassijiet bl-użu ta' sintassi karatteristika ta' lingwi ta' programmar orjentati lejn l-oġġetti. Il-kelma tas-servizz Klassi hija maħsuba għal dan, u wara għandek tispeċifika l-isem tal-klassi u tiddeskrivi l-korp tagħha fil-parentesi tal-operatur:

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

Dan huwa tip veru .NET Core, b'korp li jiddeskrivi l-proprjetajiet, il-metodi, u elementi oħra tiegħu. Ejja nħarsu lejn eżempju ta 'definizzjoni tal-klassi l-aktar sempliċi:

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

Biex toħloq oġġett (istanza tal-klassi), uża l-cmdlet Ġdid-Oġġett, jew letterali tat-tip [MyClass] u metodu psewdostatiku ġdid (kostruttur default):

$object = New-Object -TypeName MyClass

jew

$object = [MyClass]::new()

Ejja nanalizzaw l-istruttura tal-oġġett:

$object | Get-Member

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Tinsiex dwar l-ambitu: ma tistax tirreferi għal isem tat-tip bħala string jew tuża tip litterali barra l-iskrittura jew il-modulu li fih il-klassi hija definita. F'dan il-każ, il-funzjonijiet jistgħu jirritornaw istanzi tal-klassi (oġġetti) li se jkunu aċċessibbli barra l-modulu jew l-iskrittura.

Wara li toħloq l-oġġett, imla l-proprjetajiet tiegħu:

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

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Innota li d-deskrizzjoni tal-klassi tispeċifika mhux biss it-tipi ta’ proprjetà, iżda wkoll il-valuri awtomatiċi tagħhom:

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

Id-deskrizzjoni ta 'metodu ta' klassi tixbaħ id-deskrizzjoni ta 'funzjoni, iżda mingħajr ma tuża l-kelma funzjoni. Bħal f'funzjoni, il-parametri jiġu mgħoddija lill-metodi jekk meħtieġ:

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

Issa r-rappreżentant tal-klassi tagħna jista’ jitbissem:

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

Il-metodi jistgħu jiġu mgħobbija żżejjed; barra minn hekk, klassi għandha proprjetajiet u metodi statiċi, kif ukoll kostrutturi li l-ismijiet tagħhom jikkoinċidu mal-isem tal-klassi nnifisha. Klassi definita fi skript jew modulu PowerShell tista 'sservi bħala bażi għal ieħor - dan huwa kif il-wirt jiġi implimentat. F'dan il-każ, huwa permess li jintużaw klassijiet .NET eżistenti bħala dawk bażi:

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

Id-deskrizzjoni tagħna tal-ħidma ma 'oġġetti fil-PowerShell bilkemm hija eżawrjenti. Fil-pubblikazzjonijiet li ġejjin, se nippruvaw napprofondixxuh b'eżempji prattiċi: il-ħames artiklu fis-serje se jkun iddedikat għall-kwistjonijiet tal-integrazzjoni ta 'PowerShell ma' komponenti ta 'softwer ta' partijiet terzi. Partijiet tal-passat jistgħu jinstabu fil-links hawn taħt.

Parti 1: Karatteristiċi Bażiċi tal-Windows PowerShell
Parti 2: Introduzzjoni għal-Lingwa ta' Programmazzjoni Windows PowerShell
Parti 3: tgħaddi parametri għal skripts u funzjonijiet, toħloq cmdlets

X'inhu Windows PowerShell u għal xiex jintuża? Parti 4: Ħidma ma 'oġġetti, klassijiet stess

Sors: www.habr.com

Żid kumment