Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

Output teks arahan dalam tetingkap jurubahasa PowerShell hanyalah satu cara untuk memaparkan maklumat dalam bentuk yang sesuai untuk persepsi manusia. Sebenarnya hari Rabu berorientasikan untuk bekerja dengan objek: cmdlet dan fungsi menerimanya sebagai input dan kembali di pintu keluar, dan jenis pembolehubah yang tersedia secara interaktif dan dalam skrip adalah berdasarkan kelas .NET. Dalam artikel keempat siri ini, kami akan mengkaji bekerja dengan objek dengan lebih terperinci.

:Лавление:

Objek dalam PowerShell
Melihat struktur objek
Menapis objek
Menyusun objek
Memilih objek dan bahagiannya
ForEach-Object, Group-Object dan Measure-Object
Mencipta objek .NET dan COM (Objek Baharu)
Memanggil Kaedah Statik
Taip PSCustomObject
Mencipta Kelas Anda Sendiri

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 mekanisme gubahan arahan (penghantar atau saluran paip). Setiap arahan dalam saluran paip menghantar outputnya kepada yang seterusnya secara bergilir-gilir, objek demi objek. Untuk pemprosesan, anda boleh menggunakan cmdlet terkumpul atau buat sendiri ciri lanjutanuntuk melakukan pelbagai manipulasi dengan objek dalam saluran paip: menapis, menyusun, mengumpulkan, dan juga mengubah strukturnya. Menghantar data dalam bentuk ini mempunyai kelebihan yang serius: pasukan penerima tidak perlu menghuraikan aliran bait (teks), semua maklumat yang diperlukan mudah diperoleh dengan memanggil sifat dan kaedah yang sesuai.

Melihat struktur objek

Sebagai contoh, mari jalankan cmdlet Get-Process, yang membolehkan anda mendapatkan maklumat tentang proses yang dijalankan dalam sistem:

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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"}

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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()

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

Menggunakan Select-Object, anda boleh menambah sifat yang dikira pada objek yang perlu diwakili sebagai jadual hash. Dalam kes ini, nilai kunci pertamanya sepadan dengan nama sifat, dan nilai kunci kedua sepadan dengan nilai harta untuk elemen saluran paip semasa:

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

Mari kita lihat struktur objek yang melalui penghantar:

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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. fungsi dengan blok Mula, Proses dan Tamat.

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

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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 statik dan mengandungi sifat dan kaedah statik sahaja. Ini pada dasarnya adalah perpustakaan rujukan yang digunakan tanpa membuat objek. Anda boleh merujuk kepada kelas statik melalui literal dengan melampirkan nama jenis dalam kurungan segi empat sama. Walau bagaimanapun, jika kita melihat struktur objek menggunakan Get-Member, kita akan melihat jenis System.RuntimeType dan bukannya System.Environment:

[System.Environment] | Get-Member

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

Untuk melihat ahli statik sahaja, panggil Get-Member dengan parameter -Static (perhatikan jenis objek):

[System.Environment] | Get-Member -Static

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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()

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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()

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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 Select-Objek. Yang tinggal hanyalah memikirkan menambah dan mengalih keluar elemen. Melakukan ini untuk objek dari contoh sebelumnya agak mudah:

$object | Add-Member –MemberType NoteProperty –Name Age  –Value 33
$object | Get-Member

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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.

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

Untuk mengalih keluar sifat, gunakan kaedah yang sepadan:

$object.psobject.properties.remove('Name')

Mencipta Kelas Anda Sendiri

PowerShell 5.0 memperkenalkan keupayaan untuk menentukan gred menggunakan ciri sintaks bahasa pengaturcaraan berorientasikan objek. Kata perkhidmatan Kelas bertujuan untuk ini, selepas itu anda harus menentukan nama kelas dan menerangkan badannya dalam kurungan operator:

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 Objek Baru, atau literal jenis [MyClass] dan kaedah pseudostatik baru (pembina lalai):

$object = New-Object -TypeName MyClass

atau

$object = [MyClass]::new()

Mari analisa struktur objek:

$object | Get-Member

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

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 sifat dan kaedah statik, serta pembina yang namanya bertepatan dengan nama kelas itu sendiri. Kelas yang ditakrifkan dalam skrip atau modul PowerShell boleh berfungsi sebagai asas untuk yang lain - beginilah cara pewarisan dilaksanakan. Dalam kes ini, ia dibenarkan menggunakan kelas .NET sedia ada sebagai kelas asas:

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.

Bahagian 1: Ciri Asas Windows PowerShell
Bahagian 2: Pengenalan kepada Bahasa Pengaturcaraan Windows PowerShell
Bahagian 3: menghantar parameter kepada skrip dan fungsi, mencipta cmdlet

Apakah Windows PowerShell dan untuk apa ia digunakan? Bahagian 4: Bekerja dengan objek, kelas sendiri

Sumber: www.habr.com

Tambah komen