Натиҷаи матни фармонҳо дар равзанаи тарҷумони PowerShell танҳо як роҳи намоиши иттилоот дар шакли барои дарки инсон мувофиқ аст. Дар асл чоршанбе
Мундариҷа:
Объектҳо дар PowerShell
Ёдовар мешавем, ки объект маҷмӯи майдонҳои додаҳо (хусусиятҳо, рӯйдодҳо ва ғ.) ва усулҳои коркарди онҳо (методҳо) мебошад. Сохтори он аз рӯи намуд муайян карда мешавад, ки одатан ба синфҳои дар платформаи ягонаи .NET Core истифодашаванда асос меёбад. Инчунин бо объектҳои COM, CIM (WMI) ва ADSI кор кардан мумкин аст. Хусусиятҳо ва усулҳо барои иҷрои амалҳои гуногун дар додаҳо лозиманд; Илова бар ин, дар PowerShell, объектҳоро метавон ҳамчун далел ба функсияҳо ва cmdletҳо интиқол дод, арзишҳои онҳоро ба тағирёбандаҳо таъин кард ва инчунин вуҷуд дорад.
Намоиши сохтори объектҳо
Масалан, биёед cmdlet-и Get-Process-ро иҷро кунем, ки ба шумо имкон медиҳад маълумотро дар бораи равандҳои дар система иҷрошаванда ба даст оред:
Он баъзе маълумотҳои матнии форматшударо намоиш медиҳад, ки дар бораи хосиятҳои объектҳои баргардонидашуда ва усулҳои онҳо тасаввурот намедиҳад. Барои дуруст танзим кардани натиҷа, мо бояд тарзи тафтиш кардани сохтори объектҳоро омӯзем ва cmdlet Get-Member дар ин кор ба мо кӯмак мекунад:
Get-Process | Get-Member
Дар ин ҷо мо аллакай намуд ва сохторро мебинем ва бо ёрии параметрҳои иловагӣ мо метавонем, масалан, танҳо хосиятҳои объекти ба вуруд дохилшударо намоиш диҳем:
Get-Process | Get-Member -MemberType Property
Ин дониш барои ҳалли интерактивии масъалаҳои маъмурӣ ё навиштани скриптҳои шахсии шумо лозим аст: масалан, барои гирифтани маълумот дар бораи равандҳои овезон бо истифода аз моликияти Responding.
Филтр кардани объектҳо
PowerShell имкон медиҳад, ки объектҳое, ки ба шарти муайян мувофиқанд, тавассути қубур гузаранд:
Where-Object { блок сценария }
Натиҷаи иҷрои блоки скрипт дар дохили қавс бояд арзиши мантиқӣ бошад. Агар ин дуруст бошад ($true), объекте, ки ба cmdlet дар куҷо-Объект ворид карда мешавад, дар қад-қади қубур интиқол дода мешавад, вагарна ($дурӯғ) он нест карда мешавад. Масалан, биёед рӯйхати хидматҳои қатъшудаи Windows Server-ро намоиш диҳем, яъне. онҳое, ки амволи Статуси онҳо ба "Қатъ шудааст" гузошта шудааст:
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
Ҳангоми занг задан ба cmdlet Sort-Object параметри -Property мумкин аст сарфи назар карда шавад; он бо нобаёнӣ истифода мешавад. Барои мураттабсозии баръакс, параметри -Дастшавиро истифода баред:
Get-Process | Sort-Object cpu -Descending
Интихоби объектҳо ва қисмҳои онҳо
Командлети Интихоб-Объект ба шумо имкон медиҳад, ки шумораи мушаххаси объектҳоро дар аввал ё охири қубур бо истифода аз параметрҳои -Аввал ё -охирин интихоб кунед. Бо ёрии он шумо метавонед объектҳои алоҳида ё хосиятҳои муайянро интихоб кунед ва инчунин дар асоси онҳо объектҳои нав эҷод кунед. Биёед бубинем, ки чӣ тавр 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 як объекти ягонаро (-Аввал 1) бар мегардонад, ки танҳо ду майдонҳои муайянкардаи мо дорад: арзишҳои онҳо аз объекти аввалине, ки тавассути cmdlet 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
Одатан, cmdlet-ҳои баррасишуда ба таври интерактивӣ истифода мешаванд ва аксар вақт дар скриптҳо сохта мешаванд.
Эҷоди объектҳои .NET ва COM (New-Object)
Бисёр ҷузъҳои нармафзор бо интерфейсҳои .NET Core ва COM мавҷуданд, ки барои маъмурони система муфиданд. Бо истифода аз синфи System.Diagnostics.EventLog, шумо метавонед сабтҳои системаро мустақиман аз Windows PowerShell идора кунед. Биёед мисоли сохтани мисоли ин синфро бо истифода аз cmdlet New-Object бо параметри -TypeName дида бароем:
New-Object -TypeName System.Diagnostics.EventLog
Азбаски мо гузориши мушаххаси рӯйдодҳоро муайян накардаем, мисоли натиҷавии синф ягон маълумот надорад. Барои тағир додани ин, шумо бояд усули махсуси конструкторро ҳангоми сохтани он бо истифода аз параметри -ArgumentList даъват кунед. Агар мо хоҳем, ки ба сабти барнома дастрасӣ пайдо кунем, мо бояд сатри "Application" -ро ҳамчун аргумент ба созанда гузаронем:
$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()
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()
Яке аз нуқсонҳои объектҳои ин намуд он аст, ки тартиби хосиятҳои онҳо метавонад тағир ёбад. Барои пешгирӣ кардани ин, шумо бояд атрибути [ordered] -ро истифода баред:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Имкониятҳои дигари сохтани объект вуҷуд доранд: дар боло мо истифодаи cmdlet-ро дида баромадем
$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
}
Барои сохтани объект (мисоли синф) 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 бо ҷузъҳои нармафзори тарафи сеюм бахшида мешавад. Қисмҳои гузаштаро дар истиноди зер пайдо кардан мумкин аст.
Манбаъ: will.com