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) бол Where-Object командт оруулах объект дамжуулах шугамын дагуу дамжих ба өөрөөр хэлбэл ($false) устгагдах болно. Жишээлбэл, зогссон Windows Server үйлчилгээний жагсаалтыг харуулъя, i.e. Статусын өмчийг "Зогссон" гэж тохируулсан хүмүүс:
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 команд нь шугамын эхэнд эсвэл төгсгөлд -Эхний эсвэл -Сүүлийн параметрүүдийг ашиглан тодорхой тооны объектыг сонгох боломжийг танд олгоно. Үүний тусламжтайгаар та дан объект эсвэл тодорхой шинж чанаруудыг сонгохоос гадна тэдгээрт үндэслэн шинэ объект үүсгэх боломжтой. Энгийн жишээнүүдийг ашиглан cmdlet хэрхэн ажилладагийг харцгаая.
Дараах тушаал нь хамгийн их хэмжээний RAM (WS өмч) хэрэглэдэг 10 процессын талаарх мэдээллийг харуулдаг.
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 нь бидний заасан хоёр талбартай нэг объектыг (-Эхний 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 объектуудыг үүсгэх (Шинэ-Объект)
Системийн администраторуудад хэрэг болох .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 объектыг үүсгэхийн тулд та хүссэн ангийн программчлагдсан ProgId-ээр -ComObject параметрийг тохируулах хэрэгтэй.
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 объектуудыг судлах болно.
Статик аргуудыг дуудах
System.Environment болон System.Math зэрэг зарим .NET Core ангиудыг үүсгэх боломжгүй. Тэд байна
[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
Одоо байгаа hashtable-г объект руу хөрвүүлэх жишээ энд байна:
$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
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