Текстуални излаз команди у прозору тумача ПоверСхелл је само начин да се информације прикажу у облику погодном за људску перцепцију. Заправо среда
Оглашение:
Објекти у ПоверСхелл-у
Подсетимо се да је објекат скуп поља података (особина, догађаја итд.) и метода за њихову обраду (метода). Његова структура је одређена типом, који се обично заснива на класама које се користе у обједињеној .НЕТ Цоре платформи. Такође је могућ рад са ЦОМ, ЦИМ (ВМИ) и АДСИ објектима. Својства и методе су потребне за обављање различитих радњи над подацима; поред тога, у ПоверСхелл-у, објекти се могу прослеђивати као аргументи функцијама и цмдлет-има, додељивати њихове вредности променљивама, а постоји и
Сагледавање структуре објеката
На пример, покренимо Гет-Процесс цмдлет, који вам омогућава да добијете информације о процесима који се покрећу у систему:
Приказаће неке форматиране текстуалне податке који не дају никакву представу о својствима враћених објеката и њихових метода. Да бисмо фино подесили излаз, морамо да научимо како да испитамо структуру објеката, а Гет-Мембер цмдлет ће нам помоћи у томе:
Get-Process | Get-Member
Овде већ видимо тип и структуру, а уз помоћ додатних параметара можемо, на пример, приказати само својства објекта који је укључен у унос:
Get-Process | Get-Member -MemberType Property
Ово знање ће бити потребно за интерактивно решавање проблема администрације или за писање сопствених скрипти: на пример, за добијање информација о закаченим процесима користећи својство Респондинг.
Филтрирање објеката
ПоверСхелл дозвољава да објекти који испуњавају одређени услов прођу кроз цевовод:
Where-Object { блок сценария }
Резултат извршавања блока скрипте унутар заграда мора бити логичка вредност. Ако је тачно ($труе), објекат који је унет у команду Вхере-Објецт биће прослеђен дуж цевовода, у супротном ($фалсе) биће обрисан. На пример, да прикажемо листу заустављених услуга Виндовс Сервера, тј. они чије је својство Статус подешено на „Заустављено“:
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Овде поново видимо текстуални приказ, али ако желите да разумете тип и унутрашњу структуру објеката који пролазе кроз цевовод, то није тешко:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Сортирање објеката
Приликом цевоводне обраде објеката, често постоји потреба за њиховим сортирањем. Команди Сорт-Објецт се прослеђују имена својстава (кључеви за сортирање) и враћају објекте поређане према њиховим вредностима. Лако је сортирати излаз покренутих процеса према утрошеном ЦПУ времену (својство процесора):
Get-Process | Sort-Object –Property cpu
Параметар -Проперти се може изоставити када се позива Сорт-Објецт цмдлет; користи се подразумевано. За обрнуто сортирање, користите параметар -Десцендинг:
Get-Process | Sort-Object cpu -Descending
Одабир предмета и њихових делова
Селецт-Објецт цмдлет вам омогућава да изаберете одређени број објеката на почетку или крају цевовода помоћу параметара -Фирст или -Ласт. Уз његову помоћ можете одабрати појединачне објекте или одређена својства, а такође и креирати нове објекте на основу њих. Погледајмо како цмдлет функционише на једноставним примерима.
Следећа команда приказује информације о 10 процеса који троше максималну количину РАМ-а (ВС својство):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Можете одабрати само одређена својства објеката који пролазе кроз цевовод и креирати нове на основу њих:
Get-Process | Select-Object ProcessName, Id -First 1
Као резултат рада цевовода, добићемо нови објекат чија ће се структура разликовати од структуре коју враћа Гет-Процесс цмдлет. Хајде да ово проверимо користећи Гет-Мембер:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Имајте на уму да Селецт-Објецт враћа један објекат (-Фирст 1) који има само два поља која смо навели: њихове вредности су копиране из првог објекта који је у цевовод проследио Гет-Процесс цмдлет. Један од начина за креирање објеката у ПоверСхелл скриптама је заснован на коришћењу Селецт-Објецт:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
Користећи Селецт-Објецт, можете додати израчуната својства објектима који треба да буду представљени као
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 PropertyName
Ако га покренете са параметром -НоЕлемент, можете сазнати број елемената у групама.
Мера-Објекат агрегира различите збирне параметре према вредностима поља објекта у цевоводу (израчунава збир, а такође проналази минималну, максималну или просечну вредност):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Типично, цмдлети о којима се говори се користе интерактивно и често се креирају у скриптама.
Креирање .НЕТ и ЦОМ објеката (Нев-Објецт)
Постоји много софтверских компоненти са .НЕТ Цоре и ЦОМ интерфејсима које су корисне администраторима система. Користећи класу Систем.Диагностицс.ЕвентЛог, можете управљати системским евиденцијама директно из Виндовс ПоверСхелл-а. Хајде да погледамо пример креирања инстанце ове класе помоћу команде Нев-Објецт са параметром -ТипеНаме:
New-Object -TypeName System.Diagnostics.EventLog
Пошто нисмо навели конкретан дневник догађаја, резултујућа инстанца класе не садржи податке. Да бисте ово променили, потребно је да позовете посебан метод конструктора током његовог креирања помоћу параметра -АргументЛист. Ако желимо да приступимо дневнику апликације, требало би да проследимо стринг "Апплицатион" као аргумент конструктору:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Имајте на уму да смо сачували излаз команде у променљивој $АппЛог. Иако се цевоводи обично користе у интерактивном режиму, писање скрипти често захтева одржавање референце на објекат. Поред тога, основне .НЕТ Цоре класе су садржане у Систем именском простору: ПоверСхелл подразумевано тражи одређене типове у њему, тако да је писање Диагностицс.ЕвентЛог уместо Систем.Диагностицс.ЕвентЛог сасвим исправно.
Да бисте радили са дневником, можете користити одговарајуће методе:
$AppLog | Get-Member -MemberType Method
Рецимо да је обрисан методом Цлеар() ако постоје права приступа:
$AppLog.Clear()
Нев-Објецт цмдлет се такође користи за рад са ЦОМ компонентама. Има их доста - од библиотека које се испоручују са Виндовс сервером скрипти до АцтивеКс апликација, као што је Интернет Екплорер. Да бисте креирали ЦОМ објекат, потребно је да поставите параметар -ЦомОбјецт са програмским ПрогИд-ом жељене класе:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Да бисте креирали сопствене објекте са произвољном структуром, коришћење Нев-Објецт изгледа превише архаично и гломазно; овај цмдлет се користи за рад са софтверским компонентама које нису у односу на ПоверСхелл. У будућим чланцима о овом питању ће се детаљније говорити. Поред .НЕТ и ЦОМ објеката, истражићемо и ЦИМ (ВМИ) и АДСИ објекте.
Позивање статичких метода
Неке .НЕТ Цоре класе се не могу инстанцирати, укључујући Систем.Енвиронмент и Систем.Матх. Су
[System.Environment] | Get-Member
Да бисте видели само статичне чланове, позовите Гет-Мембер са параметром -Статиц (обратите пажњу на тип објекта):
[System.Environment] | Get-Member -Static
Да бисте приступили статичким својствима и методама, користите две узастопне двотачке уместо тачке после литерала:
[System.Environment]::OSVersion
Ор
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
Откуцајте ПСЦустомОбјецт
Међу бројним типовима података доступним у ПоверСхелл-у, вреди поменути ПСЦустомОбјецт, дизајниран за складиштење објеката произвољне структуре. Креирање таквог објекта помоћу команде Нев-Објецт се сматра класичним, али гломазним и застарелим начином:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Погледајмо структуру објекта:
$object | Get-Member
Почевши од ПоверСхелл-а 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'
}
Постоје и друге опције за креирање објекта: горе смо погледали коришћење цмдлета
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
Адд-Мембер цмдлет вам омогућава да додате не само својства, већ и методе претходно креираном $објекту користећи конструкцију „-МемберТипе СцриптМетход“:
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Имајте на уму да смо користили променљиву $СцриптБлоцк типа СцриптБлоцк за чување кода за нови метод.
Да бисте уклонили својства, користите одговарајући метод:
$object.psobject.properties.remove('Name')
Креирање сопствених часова
ПоверСхелл 5.0 увео је могућност дефинисања
class MyClass
{
# тело класса
}
Ово је прави .НЕТ Цоре тип, са телом које описује његова својства, методе и друге елементе. Погледајмо пример дефинисања најједноставније класе:
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)
Наш опис рада са објектима у ПоверСхелл-у тешко да је исцрпан. У следећим публикацијама покушаћемо да га продубимо практичним примерима: пети чланак у низу биће посвећен питањима интеграције ПоверСхелл-а са софтверским компонентама треће стране. Прошли делови се могу наћи на линковима испод.
Извор: ввв.хабр.цом