Излезот на текст на командите во прозорецот за толкувач на PowerShell е само начин да се прикажат информациите во форма погодна за човечка перцепција. Всушност среда
Содржина:
Објекти во PowerShell
Да потсетиме дека објектот е збирка од полиња со податоци (својства, настани итн.) и методи за нивна обработка (методи). Неговата структура е специфицирана со тип, кој обично се заснова на класи што се користат во унифицираната .NET Core платформа. Исто така е можно да се работи со објекти COM, CIM (WMI) и ADSI. Потребни се својства и методи за извршување на различни дејства на податоците; покрај тоа, во PowerShell, објектите може да се пренесат како аргументи до функциите и cmdlets, да им се доделат нивните вредности на променливите, а исто така има и
Преглед на структурата на објектите
На пример, да го извршиме Get-Process cmdlet, кој ви овозможува да добиете информации за процесите што се извршуваат во системот:
Ќе прикаже некои форматирани текстуални податоци што не даваат никаква идеја за својствата на вратените објекти и нивните методи. За да го подесиме излезот, треба да научиме како да ја испитаме структурата на објектите, а cmdlet-от Get-Member ќе ни помогне во ова:
Get-Process | Get-Member
Овде веќе ги гледаме типот и структурата, а со помош на дополнителни параметри можеме, на пример, да ги прикажеме само својствата на објектот вклучен во влезот:
Get-Process | Get-Member -MemberType Property
Ова знаење ќе биде потребно за интерактивно решавање на административните проблеми или за пишување сопствени скрипти: на пример, за добивање информации за обесени процеси користејќи го својството Responding.
Филтрирање на објекти
PowerShell дозволува објектите што исполнуваат одреден услов да се пренесуваат низ цевковод:
Where-Object { блок сценария }
Резултатот од извршувањето на блокот на скрипта во заградите мора да биде булова вредност. Ако е точно ($true), објектот што се внесува во Where-Object cmdlet ќе биде пренесен по линијата, во спротивно ($false) ќе се избрише. На пример, да прикажеме листа на запрени услуги на Windows Server, т.е. оние чие својство Статус е поставено на „Стопено“:
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Овде повторно гледаме текстуална претстава, но ако сакате да го разберете видот и внатрешната структура на предметите што минуваат низ цевководот не е тешко:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Сортирање на предмети
Кога се обработуваат предмети со цевковод, често има потреба да се сортираат. Сортирај-објект cmdlet ги пренесува имињата на својствата (копчињата за сортирање) и ги враќа објектите подредени според нивните вредности. Лесно е да се сортира излезот од процесите што се извршуваат според времето поминато на процесорот (својство на процесорот):
Get-Process | Sort-Object –Property cpu
Параметарот -Property може да се испушти при повикување на сортирање-објект cmdlet; тој се користи стандардно. За обратно сортирање, користете го параметарот -Descending:
Get-Process | Sort-Object cpu -Descending
Избор на предмети и нивни делови
cmdlet Select-Object ви овозможува да изберете одреден број на објекти на почетокот или на крајот на цевководот користејќи ги параметрите -First или -Last. Со негова помош, можете да изберете единечни објекти или одредени својства, а исто така да креирате нови објекти врз основа на нив. Ајде да погледнеме како функционира cmdlet користејќи едноставни примери.
Следната команда прикажува информации за 10-те процеси кои трошат максимална количина RAM (својство WS):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Можете да изберете само одредени својства на објектите што минуваат низ цевководот и да креирате нови врз основа на нив:
Get-Process | Select-Object ProcessName, Id -First 1
Како резултат на работата на гасоводот, ќе добиеме нов објект, чија структура ќе се разликува од структурата вратена од cmdlet-от Get-Process. Ајде да го потврдиме ова користејќи Get-Member:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Имајте на ум дека Select-Object враќа еден објект (-First 1) кој има само две полиња што ги наведовме: нивните вредности беа копирани од првиот објект што беше пренесен во цевководот од Get-Process cmdlet. Еден од начините за креирање објекти во скриптите на 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
За секој-објект, група-објект и мерка-објект
Постојат и други cmdlet за работа со предмети. Како пример, да разговараме за трите најкорисни:
За секој предмет ви овозможува да извршите код на PowerShell за секој објект во нафтоводот:
ForEach-Object { блок сценария }
Група-Објект групира објекти по вредност на имотот:
Group-Object PropertyName
Ако го извршите со параметарот -NoElement, можете да го дознаете бројот на елементи во групите.
Мерка-Објект собира различни резиме параметри по вредности на полето на објектот во цевководот (ја пресметува збирот, а исто така ја наоѓа минималната, максималната или просечната вредност):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Вообичаено, дискутираните cmdlet се користат интерактивно и често се креираат во скрипти.
Креирање .NET и COM објекти (New-Object)
Има многу софтверски компоненти со .NET Core и COM интерфејси кои се корисни за системските администратори. Користејќи ја класата System.Diagnostics.EventLog, можете да управувате со системските дневници директно од Windows PowerShell. Ајде да погледнеме пример за создавање на пример од оваа класа користејќи го cmdlet New-Object со параметарот -TypeName:
New-Object -TypeName System.Diagnostics.EventLog
Бидејќи не наведовме специфичен дневник за настани, добиениот примерок на класата не содржи податоци. За да го промените ова, треба да повикате посебен метод на конструктор за време на неговото создавање користејќи го параметарот -ArgumentList. Ако сакаме да пристапиме до дневникот на апликацијата, треба да ја пренесеме низата „Апликација“ како аргумент на конструкторот:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Ве молиме имајте предвид дека го зачувавме излезот од командата во променливата $AppLog. Иако цевководите вообичаено се користат во интерактивен режим, пишувањето скрипти често бара одржување на референца на објект. Дополнително, основните класи .NET Core се содржани во именскиот простор на системот: PowerShell стандардно бара одредени типови во него, така што пишувањето Diagnostics.EventLog наместо System.Diagnostics.EventLog е сосема точно.
За да работите со дневникот, можете да ги користите соодветните методи:
$AppLog | Get-Member -MemberType Method
Да речеме дека е исчистено со методот Clear() ако има права за пристап:
$AppLog.Clear()
cmdlet 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 изгледа премногу архаично и незгодно; овој cmdlet се користи за работа со софтверски компоненти надвор од 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, дизајниран за складирање на објекти со произволна структура. Создавањето таков објект со помош на cmdlet 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()
Еден од недостатоците на објектите од овој тип е тоа што редоследот на нивните својства може да се промени. За да го избегнете ова, мора да го користите атрибутот [нарачан]:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Постојат и други опции за создавање на објект: погоре погледнавме со користење на cmdlet
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
cmdlet-от 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
}
За да креирате објект (пример од класа), користете го cmdlet
$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