Output teks arahan dalam tetingkap jurubahasa PowerShell hanyalah satu cara untuk memaparkan maklumat dalam bentuk yang sesuai untuk persepsi manusia. Sebenarnya hari Rabu
:Лавление:
Objek dalam PowerShell
Mari kita ingat bahawa objek ialah koleksi medan data (sifat, peristiwa, dll.) dan kaedah untuk memprosesnya (kaedah). Strukturnya ditentukan oleh jenis, yang biasanya berdasarkan kelas yang digunakan dalam platform Teras .NET bersatu. Ia juga mungkin untuk bekerja dengan objek COM, CIM (WMI) dan ADSI. Sifat dan kaedah diperlukan untuk melaksanakan pelbagai tindakan pada data; sebagai tambahan, dalam PowerShell, objek boleh dihantar sebagai argumen kepada fungsi dan cmdlet, memberikan nilainya kepada pembolehubah, dan terdapat juga
Melihat struktur objek
Sebagai contoh, mari jalankan cmdlet Get-Process, yang membolehkan anda mendapatkan maklumat tentang proses yang dijalankan dalam sistem:
Ia akan memaparkan beberapa data teks berformat yang tidak memberikan sebarang idea tentang sifat objek yang dikembalikan dan kaedahnya. Untuk memperhalusi output, kita perlu belajar bagaimana untuk memeriksa struktur objek, dan cmdlet Dapatkan-Ahli akan membantu kita dengan ini:
Get-Process | Get-Member
Di sini kita sudah melihat jenis dan struktur, dan dengan bantuan parameter tambahan kita boleh, sebagai contoh, memaparkan hanya sifat objek yang disertakan dalam input:
Get-Process | Get-Member -MemberType Property
Pengetahuan ini diperlukan untuk menyelesaikan masalah pentadbiran secara interaktif atau untuk menulis skrip anda sendiri: contohnya, untuk mendapatkan maklumat tentang proses digantung menggunakan sifat Responding.
Menapis objek
PowerShell membenarkan objek yang memenuhi syarat tertentu untuk dilalui melalui saluran paip:
Where-Object { блок сценария }
Hasil daripada melaksanakan blok skrip dalam kurungan mestilah nilai boolean. Jika ia benar ($true), objek yang dimasukkan ke cmdlet Where-Object akan dihantar sepanjang saluran paip, jika tidak ($false) ia akan dipadamkan. Sebagai contoh, mari kita paparkan senarai perkhidmatan Windows Server yang dihentikan, i.e. mereka yang sifat Statusnya ditetapkan kepada "Dihentikan":
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Di sini sekali lagi kita melihat perwakilan teks, tetapi jika anda ingin memahami jenis dan struktur dalaman objek yang melalui saluran paip, ia tidak sukar:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Menyusun objek
Apabila saluran paip memproses objek, selalunya terdapat keperluan untuk menyusunnya. Cmdlet Sort-Object dilalui nama sifat (kunci pengisihan) dan mengembalikan objek yang disusun mengikut nilainya. Sangat mudah untuk mengisih output proses yang dijalankan mengikut masa CPU yang dibelanjakan (harta cpu):
Get-Process | Sort-Object –Property cpu
Parameter -Property boleh diabaikan apabila memanggil cmdlet Sort-Object; ia digunakan secara lalai. Untuk pengisihan terbalik, gunakan parameter -Descending:
Get-Process | Sort-Object cpu -Descending
Memilih objek dan bahagiannya
Cmdlet Select-Object membenarkan anda memilih bilangan objek tertentu pada permulaan atau penghujung saluran paip menggunakan parameter -First atau -Last. Dengan bantuannya, anda boleh memilih objek tunggal atau sifat tertentu, dan juga mencipta objek baharu berdasarkannya. Mari kita lihat bagaimana cmdlet berfungsi menggunakan contoh mudah.
Perintah berikut memaparkan maklumat tentang 10 proses yang menggunakan jumlah maksimum RAM (harta WS):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Anda boleh memilih hanya sifat tertentu objek yang melalui saluran paip dan mencipta yang baharu berdasarkannya:
Get-Process | Select-Object ProcessName, Id -First 1
Hasil daripada operasi saluran paip, kami akan menerima objek baharu, yang strukturnya akan berbeza daripada struktur yang dikembalikan oleh cmdlet Get-Process. Mari sahkan ini menggunakan Dapatkan-Ahli:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Ambil perhatian bahawa Select-Object mengembalikan objek tunggal (-First 1) yang mempunyai hanya dua medan yang kami tentukan: nilainya disalin daripada objek pertama yang dihantar ke saluran paip oleh cmdlet Get-Process. Salah satu cara untuk mencipta objek dalam skrip PowerShell adalah berdasarkan penggunaan Select-Object:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
Menggunakan Select-Object, anda boleh menambah sifat yang dikira pada objek yang perlu diwakili sebagai
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Mari kita lihat struktur objek yang melalui penghantar:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
ForEach-Object, Group-Object dan Measure-Object
Terdapat cmdlet lain untuk bekerja dengan objek. Sebagai contoh, mari kita bercakap tentang tiga yang paling berguna:
ForEach-Objek membolehkan anda menjalankan kod PowerShell untuk setiap objek dalam perancangan:
ForEach-Object { блок сценария }
Objek Kumpulan kumpulan objek mengikut nilai harta:
Group-Object PropertyName
Jika anda menjalankannya dengan parameter -NoElement, anda boleh mengetahui bilangan elemen dalam kumpulan.
Ukur-Objek mengagregatkan pelbagai parameter ringkasan mengikut nilai medan objek dalam saluran paip (mengira jumlah, dan juga mencari nilai minimum, maksimum atau purata):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Biasanya, cmdlet yang dibincangkan digunakan secara interaktif, dan selalunya dibuat dalam skrip.
Mencipta objek .NET dan COM (Objek Baharu)
Terdapat banyak komponen perisian dengan antara muka .NET Core dan COM yang berguna kepada pentadbir sistem. Menggunakan kelas System.Diagnostics.EventLog, anda boleh mengurus log sistem terus daripada Windows PowerShell. Mari kita lihat contoh membuat contoh kelas ini menggunakan cmdlet New-Object dengan parameter -TypeName:
New-Object -TypeName System.Diagnostics.EventLog
Oleh kerana kami tidak menentukan log peristiwa tertentu, contoh kelas yang terhasil tidak mengandungi data. Untuk menukar ini, anda perlu memanggil kaedah pembina khas semasa penciptaannya menggunakan parameter -ArgumentList. Jika kita ingin mengakses log aplikasi, kita harus lulus rentetan "Aplikasi" sebagai hujah kepada pembina:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Sila ambil perhatian bahawa kami menyimpan output arahan dalam pembolehubah $AppLog. Walaupun saluran paip biasanya digunakan dalam mod interaktif, menulis skrip selalunya memerlukan pengekalan rujukan kepada objek. Selain itu, kelas teras .NET Core terkandung dalam ruang nama Sistem: PowerShell secara lalai mencari jenis yang ditentukan di dalamnya, jadi menulis Diagnostics.EventLog dan bukannya System.Diagnostics.EventLog adalah agak betul.
Untuk bekerja dengan log, anda boleh menggunakan kaedah yang sesuai:
$AppLog | Get-Member -MemberType Method
Katakan ia dibersihkan oleh kaedah Clear() jika terdapat hak akses:
$AppLog.Clear()
Cmdlet Objek Baru juga digunakan untuk berfungsi dengan komponen COM. Terdapat banyak daripada mereka - daripada perpustakaan yang dibekalkan dengan pelayan skrip Windows kepada aplikasi ActiveX, seperti Internet Explorer. Untuk mencipta objek COM, anda perlu menetapkan parameter -ComObject dengan ProgId terprogram bagi kelas yang dikehendaki:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Untuk mencipta objek anda sendiri dengan struktur sewenang-wenangnya, menggunakan New-Object nampaknya terlalu kuno dan menyusahkan; cmdlet ini digunakan untuk berfungsi dengan komponen perisian di luar PowerShell. Dalam artikel akan datang isu ini akan dibincangkan dengan lebih terperinci. Selain objek .NET dan COM, kami juga akan meneroka objek CIM (WMI) dan ADSI.
Memanggil Kaedah Statik
Sesetengah kelas Teras .NET tidak boleh digunakan, termasuk System.Environment dan System.Math. Mereka adalah
[System.Environment] | Get-Member
Untuk melihat ahli statik sahaja, panggil Get-Member dengan parameter -Static (perhatikan jenis objek):
[System.Environment] | Get-Member -Static
Untuk mengakses sifat dan kaedah statik, gunakan dua titik bertindih berturut-turut dan bukannya noktah selepas literal:
[System.Environment]::OSVersion
Atau
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
Taip PSCustomObject
Di antara pelbagai jenis data yang terdapat dalam PowerShell, perlu disebutkan PSCustomObject, yang direka untuk menyimpan objek dengan struktur sewenang-wenangnya. Mencipta objek sedemikian menggunakan cmdlet New-Object dianggap sebagai cara klasik, tetapi menyusahkan dan ketinggalan zaman:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Mari kita lihat struktur objek:
$object | Get-Member
Bermula dengan PowerShell 3.0, sintaks lain tersedia:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Anda boleh mengakses data dalam salah satu cara yang setara:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Berikut ialah contoh menukar jadual hash sedia ada kepada objek:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()
Salah satu kelemahan objek jenis ini ialah susunan sifatnya boleh berubah. Untuk mengelakkan ini, anda mesti menggunakan atribut [tertib]:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Terdapat pilihan lain untuk mencipta objek: di atas kita melihat menggunakan cmdlet
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
Cmdlet Tambah Ahli membolehkan anda menambah bukan sahaja sifat, tetapi juga kaedah kepada $objek yang dibuat sebelum ini dengan menggunakan binaan "-MemberType ScriptMethod":
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Sila ambil perhatian bahawa kami menggunakan pembolehubah $ScriptBlock jenis ScriptBlock untuk menyimpan kod bagi kaedah baharu.
Untuk mengalih keluar sifat, gunakan kaedah yang sepadan:
$object.psobject.properties.remove('Name')
Mencipta Kelas Anda Sendiri
PowerShell 5.0 memperkenalkan keupayaan untuk menentukan
class MyClass
{
# тело класса
}
Ini adalah jenis Teras .NET yang benar, dengan badan yang menerangkan sifat, kaedah dan elemen lain. Mari kita lihat contoh mentakrifkan kelas yang paling mudah:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Untuk mencipta objek (contoh kelas), gunakan cmdlet
$object = New-Object -TypeName MyClass
atau
$object = [MyClass]::new()
Mari analisa struktur objek:
$object | Get-Member
Jangan lupa tentang skop: anda tidak boleh merujuk nama jenis sebagai rentetan atau menggunakan literal jenis di luar skrip atau modul di mana kelas ditakrifkan. Dalam kes ini, fungsi boleh mengembalikan contoh kelas (objek) yang boleh diakses di luar modul atau skrip.
Selepas mencipta objek, isikan sifatnya:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Ambil perhatian bahawa penerangan kelas menentukan bukan sahaja jenis harta, tetapi juga nilai lalainya:
class Example
{
[string]$Name = 'John Doe'
}
Perihalan kaedah kelas menyerupai perihalan fungsi, tetapi tanpa menggunakan perkataan fungsi. Seperti dalam fungsi, parameter dihantar ke kaedah jika perlu:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#описание метода
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Kini wakil kelas kami boleh tersenyum:
$object = [MyClass]::new()
$object.Smile($true)
Kaedah boleh terlebih beban; sebagai tambahan, kelas mempunyai
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
Penerangan kami tentang bekerja dengan objek dalam PowerShell hampir tidak lengkap. Dalam penerbitan berikut, kami akan cuba mendalaminya dengan contoh praktikal: artikel kelima dalam siri ini akan ditumpukan kepada isu penyepaduan PowerShell dengan komponen perisian pihak ketiga. Bahagian lepas boleh didapati di pautan di bawah.
Sumber: www.habr.com