La teksta eligo de komandoj en la PowerShell interpretisto fenestro estas nur maniero por montri informojn en formo taŭga por homa percepto. Fakte merkredon
Enhavtabelo:
Objektoj en PowerShell
Ni rememoru, ke objekto estas kolekto de datumkampoj (propraĵoj, eventoj, ktp.) kaj metodoj por prilabori ilin (metodoj). Ĝia strukturo estas specifita per tipo, kiu kutime baziĝas sur klasoj uzataj en la unuigita .NET Core-platformo. Ankaŭ eblas labori kun objektoj COM, CIM (WMI) kaj ADSI. Propraĵoj kaj metodoj estas bezonataj por plenumi diversajn agojn pri datumoj; krome, en PowerShell, objektoj povas esti transdonitaj kiel argumentoj al funkcioj kaj cmdletoj, asignitaj siajn valorojn al variabloj, kaj ankaŭ ekzistas
Vidante la strukturon de objektoj
Ekzemple, ni rulu la cmdlet Get-Process, kiu ebligas al vi akiri informojn pri la procezoj kurantaj en la sistemo:
Ĝi montros kelkajn formatitajn tekstajn datumojn, kiuj ne donas ideon pri la propraĵoj de la revenitaj objektoj kaj iliaj metodoj. Por agordi la eligon, ni devas lerni kiel ekzameni la strukturon de objektoj, kaj la cmdlet Get-Member helpos nin pri tio:
Get-Process | Get-Member
Ĉi tie ni jam vidas la tipon kaj strukturon, kaj helpe de pliaj parametroj ni povas, ekzemple, montri nur la ecojn de la objekto inkluzivita en la enigo:
Get-Process | Get-Member -MemberType Property
Ĉi tiu scio estos bezonata por solvi administrajn problemojn interage aŭ por skribi viajn proprajn skriptojn: ekzemple, por akiri informojn pri penditaj procezoj uzante la Respondan posedaĵon.
Filtri objektojn
PowerShell permesas al objektoj kiuj renkontas certan kondiĉon esti pasitaj tra dukto:
Where-Object { блок сценария }
La rezulto de ekzekuto de la skriptobloko ene de la krampoj devas esti bulea valoro. Se ĝi estas vera ($vera), la objekto kiu estas enigita al la cmdlet Where-Object estos pasita laŭ la dukto, alie ($false) ĝi estos forigita. Ekzemple, ni montru liston de haltigitaj Vindoza Servilo-servoj, t.e. tiuj, kies posedaĵo de Statuso estas agordita al "Haltigita":
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Ĉi tie denove ni vidas tekstan reprezenton, sed se vi volas kompreni la tipon kaj internan strukturon de la objektoj pasantaj tra la dukto, tio ne estas malfacila:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Ordigo de objektoj
Kiam dukto prilaborado de objektoj, estas ofte bezono ordigi ilin. La cmdleto Sort-Object ricevas la nomojn de propraĵoj (ordigaj ŝlosiloj) kaj resendas objektojn ordonitajn laŭ iliaj valoroj. Estas facile ordigi la eliron de kurantaj procezoj laŭ CPU-tempo elspezita (cpu-posedaĵo):
Get-Process | Sort-Object –Property cpu
La parametro -Property povas esti preterlasita dum vokado de la cmdleto Sort-Object; ĝi estas uzata defaŭlte. Por inversa ordigo, uzu la -Descending parametron:
Get-Process | Sort-Object cpu -Descending
Elektado de objektoj kaj iliaj partoj
La cmdleto Select-Object permesas elekti specifan nombron da objektoj ĉe la komenco aŭ fino de dukto per la -Unua aŭ -Lasta parametroj. Kun ĝia helpo, vi povas elekti unuopajn objektojn aŭ certajn ecojn, kaj ankaŭ krei novajn objektojn surbaze de ili. Ni rigardu kiel funkcias la cmdleto uzante simplajn ekzemplojn.
La sekva komando montras informojn pri la 10 procezoj konsumantaj la maksimuman kvanton da RAM (WS-posedaĵo):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Vi povas elekti nur iujn ecojn de objektoj trairantaj la dukto kaj krei novajn bazitajn sur ili:
Get-Process | Select-Object ProcessName, Id -First 1
Kiel rezulto de la operacio de la dukto, ni ricevos novan objekton, kies strukturo diferencas de la strukturo redonita de la cmdlet Get-Process. Ni konfirmu ĉi tion uzante Get-Member:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Notu, ke Elektu-Objekto resendas ununuran objekton (-Unua 1) kiu havas nur du el la kampoj, kiujn ni specifis: iliaj valoroj estis kopiitaj de la unua objekto transdonita en la dukto per la cmdlet Get-Process. Unu el la manieroj krei objektojn en PowerShell-skriptoj baziĝas sur uzado de Select-Object:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
Uzante Elektu-Objekton, vi povas aldoni komputitajn ecojn al objektoj, kiuj devas esti reprezentitaj kiel
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Ni rigardu la strukturon de objektoj pasantaj tra la transportilo:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
PorĈiu-Objekto, Grupo-Objekto kaj Mezuro-Objekto
Estas aliaj cmdletoj por labori kun objektoj. Ekzemple, ni parolu pri la tri plej utilaj:
Por Ĉiu-Objekto permesas al vi ruli PowerShell-kodon por ĉiu objekto en la dukto:
ForEach-Object { блок сценария }
Grupo-Objekto grupigas objektojn laŭ posedaĵvaloro:
Group-Object PropertyName
Se vi rulas ĝin per la parametro -NoElement, vi povas ekscii la nombron da elementoj en la grupoj.
Mezuro-Objekto agregas diversajn resumajn parametrojn per objektaj kampovaloroj en la dukto (kalkulas la sumon, kaj ankaŭ trovas la minimuman, maksimuman aŭ mezan valoron):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Tipe, la cmdletoj diskutitaj estas uzataj interage, kaj ofte estas kreitaj en skriptoj.
Kreante .NET kaj COM-objektojn (Nova-Objekto)
Estas multaj programaj komponantoj kun .NET Core kaj COM-interfacoj, kiuj estas utilaj al sistemaj administrantoj. Uzante la klason System.Diagnostics.EventLog, vi povas administri sistemajn protokolojn rekte de Windows PowerShell. Ni rigardu ekzemplon pri kreado de ekzemplo de ĉi tiu klaso uzante la cmdlet New-Object kun la parametro -TypeName:
New-Object -TypeName System.Diagnostics.EventLog
Ĉar ni ne specifis specifan okazaĵprotokolo, la rezulta okazo de la klaso enhavas neniujn datumojn. Por ŝanĝi ĉi tion, vi devas voki specialan konstruan metodon dum ĝia kreado uzante la parametron -ArgumentList. Se ni volas aliri la protokolon de aplikaĵo, ni devus pasi la ĉenon "Apliko" kiel argumenton al la konstrukciisto:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Bonvolu noti, ke ni konservis la eligon de la komando en la variablo $AppLog. Kvankam duktoj estas ofte uzitaj en interaga reĝimo, skribi manuskriptojn ofte postulas konservi referencon al objekto. Aldone, la kernaj .NET Core-klasoj estas enhavitaj en la System-nomspaco: PowerShell defaŭlte serĉas specifitajn tipojn en ĝi, do skribi Diagnostics.EventLog anstataŭ System.Diagnostics.EventLog estas sufiĉe ĝusta.
Por labori kun la protokolo, vi povas uzi la taŭgajn metodojn:
$AppLog | Get-Member -MemberType Method
Ni diru, ke ĝi estas forigita per la metodo Clear() se ekzistas alirrajtoj:
$AppLog.Clear()
La New-Object cmdleto ankaŭ estas uzata por labori kun COM-komponentoj. Estas sufiĉe multe da ili - de la bibliotekoj provizitaj per la Vindoza skriptservilo ĝis ActiveX-aplikoj, kiel Interreto Explorer. Por krei COM-objekton, vi devas agordi la parametron -ComObject kun la programa ProgId de la dezirata klaso:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Por krei viajn proprajn objektojn kun arbitra strukturo, uzi New-Object ŝajnas tro arkaika kaj maloportuna; ĉi tiu cmdlet estas uzata por labori kun programaraj komponantoj ekster PowerShell. En estontaj artikoloj ĉi tiu afero estos diskutita pli detale. Krom objektoj .NET kaj COM, ni ankaŭ esploros objektojn CIM (WMI) kaj ADSI.
Voki Statikajn Metodojn
Kelkaj .NET Kernaj klasoj ne povas esti instantiigitaj, inkluzive de System.Environment kaj System.Math. Ili estas
[System.Environment] | Get-Member
Por vidi nur senmovajn membrojn, voku Get-Member per la parametro -Static (notu la objektospecon):
[System.Environment] | Get-Member -Static
Por aliri senmovajn trajtojn kaj metodojn, uzu du sinsekvajn dupunktojn anstataŭ punkto post la laŭvorta:
[System.Environment]::OSVersion
Aŭ
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
Tajpu PSCustomObject
Inter la multaj datumtipoj disponeblaj en PowerShell, indas mencii PSCustomObject, desegnita por stoki objektojn kun arbitra strukturo. Krei tian objekton per la New-Object cmdlet estas konsiderata klasika, sed maloportuna kaj malmoderna maniero:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Ni rigardu la strukturon de la objekto:
$object | Get-Member
Komencante kun PowerShell 3.0, alia sintakso estas disponebla:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Vi povas aliri la datumojn en unu el la ekvivalentaj manieroj:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Jen ekzemplo de konvertado de ekzistanta hashtablo al objekto:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()
Unu el la malavantaĝoj de objektoj de ĉi tiu tipo estas ke la ordo de iliaj propraĵoj povas ŝanĝiĝi. Por eviti tion, vi devas uzi la [ordonita] atributon:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Estas aliaj ebloj por krei objekton: supre ni rigardis uzante la cmdleton
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
La cmdleto Add-Member permesas aldoni ne nur trajtojn, sed ankaŭ metodojn al antaŭe kreita $objekto uzante la konstrukcion "-MemberType ScriptMethod":
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Bonvolu noti, ke ni uzis la variablon $ScriptBlock de tipo ScriptBlock por konservi la kodon por la nova metodo.
Por forigi ecojn, uzu la respondan metodon:
$object.psobject.properties.remove('Name')
Kreante Viajn Proprajn Klasojn
PowerShell 5.0 enkondukis la kapablon difini
class MyClass
{
# тело класса
}
Ĉi tio estas vera .NET Core-tipo, kun korpo, kiu priskribas ĝiajn ecojn, metodojn kaj aliajn elementojn. Ni rigardu ekzemplon de difino de la plej simpla klaso:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Por krei objekton (klasan kazon), uzu la cmdleton
$object = New-Object -TypeName MyClass
aŭ
$object = [MyClass]::new()
Ni analizu la strukturon de la objekto:
$object | Get-Member
Ne forgesu pri amplekso: vi ne povas referenci al tipnomo kiel ĉeno aŭ uzi tipon laŭvorte ekster la skripto aŭ modulo en kiu la klaso estas difinita. En ĉi tiu kazo, funkcioj povas resendi klasokazojn (objektojn), kiuj estos alireblaj ekster la modulo aŭ skripto.
Post kreado de la objekto, plenigu ĝiajn ecojn:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Notu, ke la klaspriskribo specifas ne nur la posedaĵtipojn, sed ankaŭ iliajn defaŭltajn valorojn:
class Example
{
[string]$Name = 'John Doe'
}
La priskribo de klasmetodo similas la priskribon de funkcio, sed sen uzi la funkciovorton. Kiel en funkcio, parametroj estas pasigitaj al metodoj se necese:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#описание метода
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Nun la reprezentanto de nia klaso povas rideti:
$object = [MyClass]::new()
$object.Smile($true)
Metodoj povas esti troŝarĝitaj; krome, klaso havas
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
Nia priskribo pri laboro kun objektoj en PowerShell estas apenaŭ ĝisfunda. En la sekvaj publikaĵoj, ni provos profundigi ĝin per praktikaj ekzemploj: la kvina artikolo en la serio estos dediĉita al la aferoj de integriĝo de PowerShell kun triaj programaraj komponantoj. Pasintaj partoj troveblas ĉe la subaj ligiloj.
fonto: www.habr.com