PowerShell интерпретатор терезесіндегі пәрмендердің мәтіндік шығысы ақпаратты адамның қабылдауына қолайлы пішінде көрсету тәсілі ғана. Негізі сәрсенбі
Мазмұны:
PowerShell ішіндегі нысандар
Еске салайық, объект - бұл деректер өрістерінің (қасиеттер, оқиғалар және т.б.) және оларды өңдеу әдістерінің (әдістердің) жиынтығы. Оның құрылымы әдетте біртұтас .NET Core платформасында пайдаланылатын сыныптарға негізделген түр арқылы көрсетіледі. Сонымен қатар COM, CIM (WMI) және ADSI объектілерімен жұмыс істеуге болады. Деректерде әртүрлі әрекеттерді орындау үшін сипаттар мен әдістер қажет; сонымен қатар, PowerShell бағдарламасында нысандарды функциялар мен командлеттерге дәлел ретінде беруге, олардың мәндерін айнымалыларға тағайындауға болады, сонымен қатар бар.
Объектілердің құрылымын қарау
Мысалы, жүйеде іске қосылған процестер туралы ақпаратты алуға мүмкіндік беретін Get-Process командлетін іске қосайық:
Ол қайтарылған нысандардың қасиеттері мен олардың әдістері туралы ешқандай түсінік бермейтін кейбір пішімделген мәтіндік деректерді көрсетеді. Шығарылымды дәл баптау үшін біз нысандардың құрылымын зерттеуді үйренуіміз керек және Get-Member командлеті бізге осыған көмектеседі:
Get-Process | Get-Member
Мұнда біз қазірдің өзінде түрі мен құрылымын көреміз және қосымша параметрлердің көмегімен, мысалы, енгізуге енгізілген объектінің тек қасиеттерін көрсете аламыз:
Get-Process | Get-Member -MemberType Property
Бұл білім басқару мәселелерін интерактивті түрде шешу немесе өзіңіздің сценарийлеріңізді жазу үшін қажет болады: мысалы, Responding сипатын пайдаланып ілулі процестер туралы ақпаратты алу.
Объектілерді сүзу
PowerShell белгілі бір шартты қанағаттандыратын нысандарды құбыр арқылы өткізуге мүмкіндік береді:
Where-Object { блок сценария }
Жақша ішіндегі сценарий блогын орындау нәтижесі логикалық мән болуы керек. Егер ол ақиқат болса ($true), Қайда-Объект командлетіне енгізілген нысан құбыр бойымен жіберіледі, әйтпесе ($false) жойылады. Мысалы, тоқтатылған Windows Server қызметтерінің тізімін көрсетейік, яғни. Status сипаты «Тоқтатылған» күйіне орнатылғандар:
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Мұнда біз тағы да мәтіндік бейнені көреміз, бірақ құбыр арқылы өтетін нысандардың түрі мен ішкі құрылымын түсінгіңіз келсе, бұл қиын емес:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Объектілерді сұрыптау
Объектілерді құбырмен өңдеу кезінде жиі оларды сұрыптау қажеттілігі туындайды. Sort-Object командлеті сипаттар аттары (сұрыптау кілттері) беріледі және олардың мәндері бойынша реттелген нысандарды қайтарады. Жұмыс істеп тұрған процестердің шығысын жұмсалған CPU уақыты бойынша сұрыптау оңай (cpu қасиеті):
Get-Process | Sort-Object –Property cpu
Sort-Object командлетін шақырғанда -Property параметрін өткізіп жіберуге болады, ол әдепкі бойынша пайдаланылады. Кері сұрыптау үшін -Кему параметрін пайдаланыңыз:
Get-Process | Sort-Object cpu -Descending
Объектілерді және олардың бөліктерін таңдау
Select-Object командлеті -Бірінші немесе -Соңғы параметрлерін пайдаланып құбырдың басындағы немесе соңындағы нысандардың белгілі бір санын таңдауға мүмкіндік береді. Оның көмегімен сіз жеке объектілерді немесе белгілі бір қасиеттерді таңдай аласыз, сонымен қатар олардың негізінде жаңа объектілерді жасай аласыз. Қарапайым мысалдар арқылы командлет қалай жұмыс істейтінін қарастырайық.
Келесі пәрмен ЖЖҚ (WS сипаты) максималды көлемін тұтынатын 10 процесс туралы ақпаратты көрсетеді:
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Құбыр арқылы өтетін объектілердің белгілі бір қасиеттерін ғана таңдап, олардың негізінде жаңаларын жасауға болады:
Get-Process | Select-Object ProcessName, Id -First 1
Құбырдың жұмысы нәтижесінде құрылымы Get-Process командлеті қайтарған құрылымнан ерекшеленетін жаңа нысанды аламыз. Мұны Get-мүшесі арқылы тексерейік:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Select-Object біз көрсеткен өрістердің екеуі ғана бар бір нысанды (-Бірінші 1) қайтаратынын ескеріңіз: олардың мәндері Get-Process командлеті арқылы құбырға жіберілген бірінші нысаннан көшірілді. PowerShell сценарийлерінде нысандарды жасау жолдарының бірі Select-Object қолдануға негізделген:
$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 PropertyName
Егер сіз оны -NoElement параметрімен іске қоссаңыз, топтардағы элементтердің санын білуге болады.
Өлшем-объект құбырдағы нысан өрісінің мәндері бойынша әртүрлі жиынтық параметрлерді біріктіреді (қосынды есептейді, сонымен қатар ең төменгі, максималды немесе орташа мәнді табады):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Әдетте, талқыланатын командлеттер интерактивті түрде пайдаланылады және көбінесе сценарийлерде жасалады.
.NET және COM нысандарын жасау (New-Object)
Жүйе әкімшілеріне пайдалы .NET Core және COM интерфейстері бар көптеген бағдарламалық құрал құрамдастары бар. System.Diagnostics.EventLog сыныбын пайдалану арқылы жүйелік журналдарды тікелей Windows PowerShell бағдарламасынан басқаруға болады. -TypeName параметрі бар New-Object командлетін пайдаланып осы класс данасын жасау мысалын қарастырайық:
New-Object -TypeName System.Diagnostics.EventLog
Біз нақты оқиғалар журналын көрсетпегендіктен, сыныптың нәтиже данасында деректер жоқ. Мұны өзгерту үшін -ArgumentList параметрі арқылы оны жасау кезінде арнайы конструктор әдісін шақыру керек. Егер біз қолданбалар журналына қол жеткізгіміз келсе, конструкторға аргумент ретінде «Қолданба» жолын беруіміз керек:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Пәрменнің нәтижесін $AppLog айнымалысында сақтағанымызды ескеріңіз. Конвейерлер әдетте интерактивті режимде пайдаланылғанымен, сценарийлерді жазу көбінесе нысанға сілтемені сақтауды талап етеді. Сонымен қатар, негізгі .NET Core сыныптары Жүйе аттар кеңістігінде қамтылған: PowerShell әдепкі бойынша ондағы көрсетілген түрлерді іздейді, сондықтан System.Diagnostics.EventLog орнына Diagnostics.EventLog жазу өте дұрыс.
Журналмен жұмыс істеу үшін сәйкес әдістерді қолдануға болады:
$AppLog | Get-Member -MemberType Method
Қол жеткізу құқықтары бар болса, ол Clear() әдісімен тазартылды делік:
$AppLog.Clear()
New-Object командлеті COM құрамдастарымен жұмыс істеу үшін де пайдаланылады. Олардың өте көп - Windows сценарий серверімен қамтамасыз етілген кітапханалардан бастап, Internet Explorer сияқты ActiveX қолданбаларына дейін. 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. Олар
[System.Environment] | Get-Member
Тек статикалық мүшелерді көру үшін Get-Member параметрін -Static параметрімен шақырыңыз (нысан түрін ескеріңіз):
[System.Environment] | Get-Member -Static
Статикалық сипаттар мен әдістерге қол жеткізу үшін литералдан кейінгі нүктенің орнына екі дәйекті қос нүктені пайдаланыңыз:
[System.Environment]::OSVersion
Немесе
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
PSCustomObject теріңіз
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'
}
Деректерге баламалы жолдардың бірімен қол жеткізуге болады:
$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'
}
Нысан жасаудың басқа нұсқалары бар: жоғарыда командлетті пайдалануды қарастырдық
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
Add-Member командлеті тек сипаттарды ғана емес, сонымен қатар "-MemberType ScriptMethod" құрылымын пайдалану арқылы бұрын жасалған $нысанына әдістерді қосуға мүмкіндік береді:
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Жаңа әдіс кодын сақтау үшін ScriptBlock түріндегі $ScriptBlock айнымалы мәнін пайдаланғанымызды ескеріңіз.
Сипаттарды жою үшін сәйкес әдісті пайдаланыңыз:
$object.psobject.properties.remove('Name')
Жеке сыныптарыңызды құру
PowerShell 5.0 анықтау мүмкіндігін енгізді
class MyClass
{
# тело класса
}
Бұл оның қасиеттерін, әдістерін және басқа элементтерін сипаттайтын денесі бар шынайы .NET Core түрі. Ең қарапайым классты анықтаудың мысалын қарастырайық:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Нысан (сынып данасы) жасау үшін командлетті пайдаланыңыз
$object = New-Object -TypeName MyClass
немесе
$object = [MyClass]::new()
Объектінің құрылымын талдап көрейік:
$object | Get-Member
Аумақ туралы ұмытпаңыз: түр атауына жол ретінде сілтеме жасай алмайсыз немесе сынып анықталған сценарийден немесе модульден тыс типті литералды пайдалана алмайсыз. Бұл жағдайда функциялар модульден немесе сценарийден тыс қолжетімді болатын сынып даналарын (нысандарын) қайтара алады.
Объектіні жасағаннан кейін оның қасиеттерін толтырыңыз:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Сынып сипаттамасы тек сипат түрлерін ғана емес, сонымен қатар олардың әдепкі мәндерін де көрсететінін ескеріңіз:
class Example
{
[string]$Name = 'John Doe'
}
Класс әдісінің сипаттамасы функцияның сипаттамасына ұқсайды, бірақ функция сөзін қолданбайды. Функциядағыдай параметрлер қажет болған жағдайда әдістерге беріледі:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#описание метода
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Енді біздің сыныптың өкілі күледі:
$object = [MyClass]::new()
$object.Smile($true)
Әдістерді шамадан тыс жүктеуге болады, сонымен қатар сыныпта бар
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
PowerShell бағдарламасындағы нысандармен жұмыс істеу сипаттамасымыз толық емес. Келесі жарияланымдарда біз оны практикалық мысалдармен тереңдетуге тырысамыз: сериядағы бесінші мақала PowerShell бағдарламасын үшінші тарап бағдарламалық жасақтамасының құрамдастарымен біріктіру мәселелеріне арналған. Өткен бөлімдерді төмендегі сілтемелерден табуға болады.
Ақпарат көзі: www.habr.com