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
Werrej:
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
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:
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
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"}
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
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
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
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
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()
Billi tuża Agħżel-Oġġett, tista 'żżid proprjetajiet ikkalkulati ma' oġġetti li jeħtieġ li jiġu rappreżentati bħala
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
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
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.
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
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
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
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
[System.Environment] | Get-Member
Biex tara membri statiċi biss, ċempel Get-Member bil-parametru -Static (innota t-tip ta' oġġett):
[System.Environment] | Get-Member -Static
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()
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
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()
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
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
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.
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
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
$object = New-Object -TypeName MyClass
jew
$object = [MyClass]::new()
Ejja nanalizzaw l-istruttura tal-oġġett:
$object | Get-Member
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
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
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.
Sors: www.habr.com