PowerShell-ում հրահանգների տեքստային ելքը միանշանակ միջոց է տեղեկատվության ներկայացման համար, որը հասկանալի է մարդուն։ Իրականում միջավայր օբյեկտներով աշխատելուն՝ կոմանդլետները և գործառույթները ստանում են դրանք որպես մուտք և , իսկ ինտերակտիվ ռեժիմում և սցենարներում մատչելի փոփոխականների տեսակները հիմնված են .NET դասերի վրա։ Չորրորդ հոդվածում մենք առավել մանրամասն կքննարկենք օբյեկտների հետ աշխատանքը։
Ժամանակացույցը:
PowerShell-ում օբյեկտները
հրամանների կոմպոզիցիայի մեխանիզմներ ընդլայնված գործառույթներ Օրինակ, մենք կգործարկենք Get-Process կոմանդլետը, որը թույլ է տալիս ստանալ տեղեկատվություն համակարգում աշխատող պրոցեսների մասին․
Օբյեկտների կառուցվածքի դիտում
Սա էկրանին կարտածի որոշ ձևավորված տեքստի տվյալներ, որոնք չեն արձանագրում վերադարձած օբյեկտների հատկությունները և դրանց մեթոդները։ Ելքի չնչին մակերեսային ուսումնասիրության համար անհրաժեշտ է սովորել հետազոտել օբյեկտների կառուցվածքը, և դրա համար օգնություն կտրամադրի Get-Member կոմանդլետը:

Get-Process | Get-Member
Այս պահին արդեն տեսնում ենք տեսակն ու կառուցվածքը, և հավելյալ պարամետրերի օգնությամբ կարող ենք, օրինակ, առանձին ցուցադրել միայն մուտքագրված օբյեկտի գծերը։ 
Get-Process | Get-Member -MemberType Property
Այս գիտելիքները անհրաժեշտ կլինեն ինտերակտիվ ռեժիմում և սեփական ստեղարանակերպերը գրելու համար։ Վ مثար, որպեսզի տեղեկություն ստանանք կախված պրոցեսների մասին Responding հատկությամբ։Այս գիտելիքները անհրաժեշտ կլինեն ինտերակտիվ ռեժիմում վարչական խնդիրները լուծելու կամ սեփական սկրիպտեր գրելիս: օրինակ, ստանալու համար դադարեցված գործընթացների մասին տեղեկություններ `Responding` հատկության միջոցով:
Օբյեկտների ֆիլտրացում
PowerShell-ը թույլ է տալիս անցկացնել որոշակի պայմանները բավարարող օբյեկտներ խողովակի միջով:
Where-Object { սկրիպտի բլոկ }Սկրիպտի բլոկի կատարման արդյունքում պետք է լինի տրամաբանական արժեք: Եթե այն ճիշտ է ($true), Where-Object կոնցոլային հրամանով բառը փոխանցվելու է շարունակություն, հակառակ դեպքում (արժեքը $false) այն կհանվի: Օրինակ, ցույց կտանք Windows Server-ի կանգնած ծառայությունների ցանկը, այսինքն, որոնք Status հատկության արժեքը "Stopped" է:
Get-Service | Where-Object {$_.Status -eq "Stopped"} 
Ա这里 մենք մեկ անգամ ևս տեսնում ենք տեքստային ներկայացում, սակայն ցանկության դեպքում հասկանալ անցնող օբյեկտների տիպը և ներքին կառուցվածքը հեշտ է:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member 
Օբյեկտների դասակարգում
Խողովակային մշակումների ժամանակ հաճախ անհրաժեշտ է նրանց դասակարգումը: Sort-Object հրամանով փոխանցվում են հատկությունների անունները (դասակարգման խուլ) և նա վերադարձնում է դասավորված օբյեկտներ: Ունեցված պրոցեսների ցուցակը հեշտությամբ կարելի է դասակարգել չորն ցանկապատում գնահատակազմ (cpu) ըստ ծախսված պրոցեսորի ժամանակի.
Get-Process | Sort-Object –Property cpuSort-Object հրամանով -Property պարամետրը ներկայացնելու համար պարտադիր չէ - այն օգտագործվում է ըստ կամ ունիվերսալ: Ավարտի դասակարգման համար կիրառվում է -Descending պարամետրը:
Get-Process | Sort-Object cpu -Descending 
Օբյեկտների և դրանց մասերի առանձնացում
Select-Object հրամանով կարելի է հտրոն ընդգծել խողովակի սկզբում կամ վերջում որոշակի քանակությամբ օբյեկտներ -First կամ -Last պարամետրերով: Այս պարամետրով կարելի է ընտրել յուրահատուկ օբյեկտներ կամ որոշակի հատկություններ, ինչպես նաև ստեղծել նոր օբյեկտներ դրանց հիման վրա: Նախանը պատասխանենք հրամանի օրինակով:
Հաջորդ հրամանը ցույց է տալիս 10 պրոցեսների տվյալները, որոնք առկա են հնարավոր առավելագույն RAM-ի (WS) արժեքով:
Get-Process | Sort-Object WS -Descending | Select-Object -First 10 
Կարելի է միայն որոշակի հատկություններ ընդգծել ընթացող օբյեկտների և նորեր ստեղծել նրանց հիման վրա:
Get-Process | Select-Object ProcessName, Id -First 1Դրա արդյունքում մենք կստանանք նոր օբյեկտ, որի կառուցվածքը տարբերվում է Get-Process հրամանով վերադարձվող կառուցվածքից: Ներառենք այս մասին Get-Member տեսելիս:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member 
Խնդրում ենք ուշադրություն դարձնել, որ Select-Object-ը վերադարձնում է հմուտ օբյեկտ (-First 1), որի միայն երկու ընվողովոր խիստ հատկություններ կան: Դրանք կանխորոշվել են առաջին օբյեկտից, որը տրամադրվել է խողովակով Get-Process հրամանով: Select-Object-ի օգտագործման վրա հիմնվում է PowerShell-ում օբյեկտների ստեղծման մի ճանապարհ:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType() 
Select-Object-ի միջոցով հնարավոր է ավելացնել օբյեկտներին հաշվարկային հատկություններ, որոնք պետք է ներկայացվեն . Հարկավոր է, որ առաջին բանալիի արժեքը վերաբերի հատկության անվանը, իսկ երկրորդ բանալիի արժեքը՝ ընթացիկ խողովակի համար պատկանող հատկության արժեքին:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} 
Ամփոփենք կոնվեյերով անցնող օբյեկտների կառուցվածքը՝
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member 
ForEach-Object, Group-Object և Measure-Object
Օբյեկտների հետ աշխատելու համար կան նաև այլ կոմանդլետներ: Օրինակ, կխոսենք երեք առավել օգտակար մասին՝
ForEach-Object առաջարկում է իրականացնել PowerShell լեզվով կոդ յուրաքանչյուր օբյեկտի համար կոնվեյերում:
ForEach-Object { սցենարի բլոկ }Group-Object գ grouped ը տվյալների հոսքը ըստ հատկության արժեքի:
Group-Object PropertyNameԵթե այն գործարկվի -NoElement պարամետրով, հնարավոր է պարզել խմբերի մեջ առկայսների քանակը:
Measure-Object հավաքում է տարբեր համառոտ տվյալներ դեպի օբյեկտների հոսքի հկայի խաղարկային արժեքների (հաշվում է գումարը, ինչպես նաև գտնում նվազել, ավելին կամ միջինը):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -SumՍովորաբար, նկարագրված կոմանդլետները օգտագործվում են ինտերակտիվ ռեժիմում, մինչդեռ սցենարներում հաճախ ստեղծվում են Begin, Process և End բլոկներով:
Նոր օբյեկտների ստեղծում .NET և COM (New-Object)
Կա բազմաթիվ ծրագրային բաղադրիչներ .NET Core և COM ինտերֆեյսերով, որոնք օգտակար կլինեն համակարգային ադմինիստրատորներին: System.Diagnostics.EventLog դասի միջոցով հնարավոր է կառավարել համակարգային գրառումները անմիջապես Windows PowerShell-ից: Վերլուծենք այս դասի օրինակ՝ New-Object կոմանդլետով օգտագործելով -TypeName պարամետրը:
New-Object -TypeName System.Diagnostics.EventLog 
Քանի որ մենք չնշեցինք հատուկ իրադարձությունների գրանցում, ստացված դասի օրինակն չունի տվյալներ: Դա փոփոխելու համար, անհրաժեշտ է ստեղծելու ժամանակ օգտագործել հատուկ մեթոդ-կոնստրուկտորը -ArgumentList պարամետրով: Եթե ցանկանում ենք մուտք գործել ծրագրային գրանցումը, կոնստրուկտորին փոխանցեք "Application" շարքի որպես արգումենտ:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog 
Նշում տվեք. կոմանդի արդյունքները մենք պահեցինք $AppLog փոփոխականի մեջ: Մանրամասների ռեժիմում սովորաբար օգտագործվում են կոնվեյերները, բայց սցենարները հաճախ պահանջում են օբյեկտի հղումը պահպանել: Ավելին, հիմնական .NET Core դասերը գտնվում են System հիշողություններում: PowerShell-ը ըստ մշակող ընդունվող տեսակների որոնում է այստեղ, ուստի Diagnostics.EventLog գրելու փոխարեն System.Diagnostics.EventLog-ը լիովին ճիշտ է:
Գրանցման հետ աշխատանքի համար կարելի է պատվիրել համապատասխան մեթոդներին:
$AppLog | Get-Member -MemberType Method 
Կ ասենք, որ դա մաքրվում է Clear() մեթոդով, հասանելիության իրավունքների առկայության դեպքում:
$AppLog.Clear()New-Object կոմանդլետը օգտագործվում է նաև COM բաղադրիչներով աշխատելու համար: Դրանք բավական շատ են՝ Windows սերվերի հետ տրամադրված գրադարաններից մինչև ActiveX ծրագրեր, օրինակ, Internet Explorer: COM օբյեկտ ստեղծելու համար պահանջվում է -ComObject պարամետրը նշելով անհրաժեշտ դասի ProgId-ն:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObjectՀամակարգի բարդ կառուցվածքի սեփական օբյեկտների ստեղծելու համար New-Object-ի օգտագործումը շատ հին ու բարդ է թվում, այս հրամանը օգտագործվում է PowerShell-ի արտաքին ծրագրային բաղադրիչների հետ աշխատելու համար: Արդյունաբերության հետագայում այս հարցը կքննարկվի ավելի մանրամասն: Այսուհետ .NET և COM օբյեկտներից բացի մենք նույնպես կսովորենք CIM (WMI) և ADSI օբյեկտները:
Վիճակի մեթոդների վերզանգվածում
Որոշ .NET Core դասերի օրինակներ ստեղծել հնարավոր չի: Դրանց մեջ են մտնում System.Environment և System.Math: Նրանք և միայն ստատիկ հատկություններ և մեթոդներ են պարունակում: Ցուցաբերաբար, դրանք օգտակար գրապահարաններ են, որոնք օգտագործվում են օբյեկտներ ստեղծելու առանց: Ստատիկ դասին հղում տալու համար կարող եք օգտագործել գրականություն, աճպարարի անունը փակելով քառակուսի մեջ: Այս դեպքում, եթե դիտենք օբյեկտի կառուցվածքը Get-Member-ի միջոցով, մենք կտեսնենք System.RuntimeType տեսակը՝ ոչ System.Environment:
[System.Environment] | Get-Member 
Միայն ստատիկ տարրերը դիտելու համար հարկավոր է կանչել Get-Member `-Static` պարամետրով (ակնկալեք օբյեկտի տեսակը):
[System.Environment] | Get-Member -Static 
Ստատիկ հատկություններին և մեթոդներին մուտք ունենալու համար օգտագործվում են երկու զուգահեռ կոլոններ, որոնք տեղադրված են կետից հետո:
[System.Environment]::OSVersionԿամ
$test=[System.Math]::Sqrt(25)
$test
$test.GetType() 
PSCusomObject-ի տեսակը
PowerShell-ում առկա շատ տվյալների տիպերի մեջ առանձնահատուկ է PSCustomObject-ը, որը նախատեսված է պատահական կառուցվածքի օբյեկտներ պահելու համար: Նման օբյեկտ ստեղծելու մեթոդը New-Object հրամանի միջոցով համարվում է դասական, սակայն դժվար ու վաղանցիկ՝
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Եկեք տեսնենք օբյեկտի կառուցվածքը:
$object | Get-Member 
PowerShell 3.0-ից սկսած հասանելի է նաև այլ սինտակսիս:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Տվյալներին մուտք ունենալու համար կարող եք օգտագործել equivalents տարբերակներից մեկը:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Եկեք տեսնենք արդյունքների օրինակ՝ գոյություն ունեցող հեշ-ճարտարի օբյեկտը փոխելու համար:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()

Այս տիպի օբյեկտների թերություններից մեկը՝ դրանց հատկությունների կարգը կարող է փոխվել: Այս երևույթից խուսափելու համար հարկավոր է օգտագործել [ordered] ատրիբուտը:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Կա նաև այլ օբյեկտ ստեղծելու տարբերակներ: վերևում մենք ձեռք բերեցինք Select-Object հրամանի օգտագործումը: $object | Add-Member –MemberType NoteProperty –Name Age –Value 33 $object | Get-Member
Add-Member հրամանը թույլ է տալիս ավելացնել նախկինում ստեղծված $object օբյեկտին ոչ միայն ավելություններ, այլև մեթոդներ՝ իհարկե "-MemberType ScriptMethod" կոնստրուկցիայի միջոցով:

Add-Member հրամանը թույլ է տալիս ավելացնել ավելի առաջ ստեղծված $object օբյեկտին ոչ միայն հատկություններ, այլև մեթոդներ "-MemberType ScriptMethod" կոնստրուկցիայի միջոցով:
$ScriptBlock = {
# կոդ
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Հիշեցնենք, որ նոր մեթոդի կոդը պահպանելու համար օգտագործեցինք $ScriptBlock փոփոխությունը типа ScriptBlock:

Ապրանքը հեռացնելու համար օգտագործվում է համապատասխան մեթոդը:
$object.psobject.properties.remove('Name')
Մեր հիշեցումը՝ օբյեկտներն են տվյալների դաշտերի (գծերի, միջոցների և այլն) և դրանց մշակման ուղիների (մեթոդների) համընկնումը։ Նրա կառուցվածքը սահմանվում է տեսակով, որը հիմնականում հիմնված է օգտագործվող .NET Core միասնական պլատֆորմայի դասերի վրա։ Այնպես չէ, որ հնարավոր է աշխատել COM, CIM (WMI) և ADSI օբյեկտների հետ։ Գծերն ու մեթոդները անհրաժեշտ են տեղեկատվության հետ տարբեր գործողություններ կատարելու համար, ավելին, PowerShell-ում օբյեկտները կարելի է փոխանցել գործառույթների և կոմանդլետների արգումենտների ձևով, նրանց արժեքները կարող են վերագրավվել փոփոխականներին, ինչպես նաև գոյություն ունեն
PowerShell 5.0-ում հնարավոր է դարձել սահմանել օբեկտ-օրենտացված ծրագրավորման լեզուներին բնորոշ սինտեքսով: Դրա համար նախատեսված է ծառայողական խոսքը Class, որի հետևում նշվում է կլասի անունը և դրա մարմինը նկարագրվում է գործառնական括ումներում:
class MyClass
{
# կլասի մարմինը
}
Այսպիսով, սա իրական .NET Core տիպ է, որի մարմնում նկարագրվում են նրա հատկությունները, մեթոդները և այլ տարրբեր: Հրաժեշտ է պարզել պարզագույն կլասի սահմանման օրինակը:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Օբյեկտ (կլասի օրինակ) ստեղծելու համար օգտագործվում է commandlet , կամ [MyClass] լիտերալը և new (տարբերակիչ կառուցել):
$object = New-Object -TypeName MyClassկամ
$object = [MyClass]::new()Վերլուծենք օբյեկտի կառուցվածքը:
$object | Get-Member 
Միասնական չմոռանալ տեսադաշտի մասին: Չենք կարող հղել տիպի անունը որպես տող կամ օգտագործել տիպի լիտերալը դասընթացից կամ մոդուլից դուրս, որտեղ սահմանվել է կլասը: Այդ դեպքում ֆունկցիաները կարող են վերադարձնել կլասի օրինակները (օբյեկտները), որոնք հասանելի կլինեն մոդուլի կամ դասընթացի դուրս:
Օբյեկտը ստեղծելուց հետո լրացնենք նրա հատկությունները:
$object.Name = 'Իվան Դանքո'
$object.City = 'Մոսկվա'
$object.Country = 'Ռուսաստան'
$object

Կնշենք, որ կլասի նկարագրության մեջ սահմանվում են ոչ միայն հատկությունների տիպերը, այլ նաև նրանց արդեն գոյություն ունեցող արժեքները:
class Example
{
[string]$Name = 'ճանապարհի Ջոն'
}
Կլասի մեթոդի նկարագրությունը նման է ֆունկցիայի նկարագրությանը, բայց առանց function ծառայողական խոսքի օգտագործման: Ինչպես ֆունկցիայի պարագայում, հարկ եղած դեպքում մեթոդներին փոխանցվում են պարամետրեր:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
# մեթոդի նկարագրություն
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Այժմ մեր կլասի ներկայացուցիչը կարող է ժպտալ:
$object = [MyClass]::new()
$object.Smile($true)
Մեթոդները կարելի է թարմացնել, բացի այդ, կլասու մոտ լինում են , ինչպես նաև կառուցողներ, որոնց անունները համընկնում են հենց կլասի անվան հետ: PowerShell-ում սահմանված կլասը կարող է ծառայել որպես հիմք մյուսի համար՝ այնպես որ ազդարարություն իրականացվում է: Այդտեղ համանականները թույլ են չափելի լինել դրանք արատավոր .NET առակների:
class MyClass2 : MyClass
{
#նոր կլասի մարմինը, որի հիմքն է MyClass
}
[MyClass2]::new().Smile($true)
PowerShell-ում օբյեկտների հետ աշխատելու մեր նկարագիրը դժվար է անվանել ամբողջական: Գալու հոդվածներում փորձենք մեքենային խորացնել այն գործող օրինակներով: Հինգերորդ հոդվածի շրջանը կարտագործվի PowerShell-ի ինտեգրացիայի թեմաներին: Նախորդ տարբերակները կարելի է գտնել ստորև նշված հղումներով:
Ընտանիք: habr.com
