Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Output teks dari perintah di jendela juru bahasa PowerShell hanyalah cara untuk menampilkan informasi dalam bentuk yang sesuai dengan persepsi manusia. Sebenarnya hari Rabu berorientasi untuk bekerja dengan objek: cmdlet dan fungsi menerimanya sebagai masukan dan kembali di pintu keluar, dan tipe variabel yang tersedia secara interaktif dan dalam skrip didasarkan pada kelas .NET. Dalam artikel keempat dari seri ini, kita akan mempelajari bekerja dengan objek secara lebih rinci.

contoh:

Objek di PowerShell
Melihat struktur benda
Memfilter objek
Menyortir objek
Memilih objek dan bagian-bagiannya
Untuk Setiap Objek, Objek Grup, dan Objek Ukur
Membuat objek .NET dan COM (Objek Baru)
Memanggil Metode Statis
Ketik PSCustomObject
Membuat Kelas Anda Sendiri

Objek di PowerShell

Mari kita ingat kembali bahwa suatu objek adalah kumpulan bidang data (properti, peristiwa, dll.) dan metode untuk memprosesnya (metode). Strukturnya ditentukan oleh tipenya, yang biasanya didasarkan pada kelas yang digunakan dalam platform .NET Core terpadu. Dimungkinkan juga untuk bekerja dengan objek COM, CIM (WMI) dan ADSI. Properti dan metode diperlukan untuk melakukan berbagai tindakan pada data; selain itu, di PowerShell, objek dapat diteruskan sebagai argumen ke fungsi dan cmdlet, menetapkan nilainya ke variabel, dan ada juga mekanisme komposisi perintah (konveyor atau pipa). Setiap perintah dalam pipeline meneruskan outputnya ke perintah berikutnya secara bergantian, objek demi objek. Untuk pemrosesan, Anda dapat menggunakan cmdlet yang telah dikompilasi atau membuatnya sendiri fitur lanjutanuntuk melakukan berbagai manipulasi dengan objek di dalam pipa: memfilter, mengurutkan, mengelompokkan, dan bahkan mengubah strukturnya. Mengirimkan data dalam bentuk ini memiliki keuntungan serius: tim penerima tidak perlu mengurai aliran byte (teks), semua informasi yang diperlukan mudah diambil dengan memanggil properti dan metode yang sesuai.

Melihat struktur benda

Misalnya, jalankan cmdlet Get-Process, yang memungkinkan Anda memperoleh informasi tentang proses yang berjalan di sistem:

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Ini akan menampilkan beberapa data teks berformat yang tidak memberikan gambaran apa pun tentang properti objek yang dikembalikan dan metodenya. Untuk menyempurnakan hasilnya, kita perlu mempelajari cara memeriksa struktur objek, dan cmdlet Get-Member akan membantu kita dalam hal ini:

Get-Process | Get-Member

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Di sini kita sudah melihat jenis dan strukturnya, dan dengan bantuan parameter tambahan, kita dapat, misalnya, hanya menampilkan properti objek yang disertakan dalam input:

Get-Process | Get-Member -MemberType Property

Pengetahuan ini akan diperlukan untuk menyelesaikan masalah administrasi secara interaktif atau untuk menulis skrip Anda sendiri: misalnya, untuk memperoleh informasi tentang proses yang macet menggunakan properti Responding.

Memfilter objek

PowerShell mengizinkan objek yang memenuhi kondisi tertentu untuk dilewatkan melalui pipa:

Where-Object { блок сценария }

Hasil eksekusi blok skrip di dalam tanda kurung harus berupa nilai boolean. Jika benar ($benar), objek yang dimasukkan ke cmdlet Where-Object akan diteruskan sepanjang alur, jika tidak ($false) maka akan dihapus. Misalnya, mari kita tampilkan daftar layanan Windows Server yang dihentikan, mis. mereka yang properti Statusnya disetel ke “Berhenti”:

Get-Service | Where-Object {$_.Status -eq "Stopped"}

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Di sini sekali lagi kita melihat representasi tekstual, tetapi jika Anda ingin memahami jenis dan struktur internal objek yang melewati pipa, hal ini tidak sulit:

Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Menyortir objek

Saat memproses objek melalui pipeline, sering kali ada kebutuhan untuk mengurutkannya. Cmdlet Sortir-Objek meneruskan nama properti (kunci pengurutan) dan mengembalikan objek yang diurutkan berdasarkan nilainya. Sangat mudah untuk mengurutkan output dari proses yang berjalan berdasarkan waktu yang dihabiskan CPU (properti cpu):

Get-Process | Sort-Object –Property cpu

Parameter -Property dapat dihilangkan saat memanggil cmdlet Sort-Object; ini digunakan secara default. Untuk pengurutan terbalik, gunakan parameter -Descending:

Get-Process | Sort-Object cpu -Descending

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Memilih objek dan bagian-bagiannya

Cmdlet Select-Object memungkinkan Anda memilih sejumlah objek tertentu di awal atau akhir alur menggunakan parameter -Pertama atau -Terakhir. Dengan bantuannya, Anda dapat memilih objek tunggal atau properti tertentu, dan juga membuat objek baru berdasarkan objek tersebut. Mari kita lihat cara kerja cmdlet menggunakan contoh sederhana.

Perintah berikut menampilkan informasi tentang 10 proses yang memakan jumlah maksimum RAM (properti WS):

Get-Process | Sort-Object WS -Descending | Select-Object -First 10

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Anda hanya dapat memilih properti tertentu dari objek yang melewati alur dan membuat properti baru berdasarkan properti tersebut:

Get-Process | Select-Object ProcessName, Id -First 1

Sebagai hasil dari pengoperasian pipeline, kita akan menerima objek baru, yang strukturnya akan berbeda dari struktur yang dikembalikan oleh cmdlet Get-Process. Mari verifikasi ini menggunakan Get-Member:

Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Perhatikan bahwa Select-Object mengembalikan satu objek (-Pertama 1) yang hanya memiliki dua bidang yang kami tentukan: nilainya disalin dari objek pertama yang diteruskan ke pipa oleh cmdlet Get-Process. Salah satu cara membuat objek dalam skrip PowerShell didasarkan pada penggunaan Select-Object:

$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Menggunakan Select-Object, Anda dapat menambahkan properti terhitung ke objek yang perlu direpresentasikan sebagai tabel hash. Dalam hal ini, nilai kunci pertama sesuai dengan nama properti, dan nilai kunci kedua sesuai dengan nilai properti elemen pipa saat ini:

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

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Mari kita lihat struktur benda yang melewati conveyor:

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

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Untuk Setiap Objek, Objek Grup, dan Objek Ukur

Ada cmdlet lain untuk bekerja dengan objek. Sebagai contoh, mari kita bahas tiga hal yang paling berguna:

Untuk Setiap-Obyek memungkinkan Anda menjalankan kode PowerShell untuk setiap objek dalam alur:

ForEach-Object { блок сценария }

Grup-Objek mengelompokkan objek berdasarkan nilai properti:

Group-Object PropertyName

Jika Anda menjalankannya dengan parameter -NoElement, Anda dapat mengetahui jumlah elemen dalam grup.

Ukur-Objek menggabungkan berbagai parameter ringkasan berdasarkan nilai bidang objek dalam pipa (menghitung jumlah, dan juga menemukan nilai minimum, maksimum, atau rata-rata):

Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum

Biasanya, cmdlet yang dibahas digunakan secara interaktif, dan sering kali dibuat dalam skrip. fungsi dengan blok Mulai, Proses, dan Akhir.

Membuat objek .NET dan COM (Objek Baru)

Ada banyak komponen perangkat lunak dengan antarmuka .NET Core dan COM yang berguna bagi administrator sistem. Menggunakan kelas System.Diagnostics.EventLog, Anda dapat mengelola log sistem langsung dari Windows PowerShell. Mari kita lihat contoh pembuatan instance kelas ini menggunakan cmdlet Objek Baru dengan parameter -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Karena kami tidak menentukan log peristiwa tertentu, instance kelas yang dihasilkan tidak berisi data. Untuk mengubahnya, Anda perlu memanggil metode konstruktor khusus selama pembuatannya menggunakan parameter -ArgumentList. Jika kita ingin mengakses log aplikasi, kita harus meneruskan string "Aplikasi" sebagai argumen ke konstruktor:

$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Harap dicatat bahwa kami menyimpan output dari perintah dalam variabel $AppLog. Meskipun pipeline biasanya digunakan dalam mode interaktif, penulisan skrip sering kali memerlukan pemeliharaan referensi ke suatu objek. Selain itu, kelas inti .NET Core terdapat dalam namespace Sistem: PowerShell secara default mencari tipe tertentu di dalamnya, jadi menulis Diagnostics.EventLog alih-alih System.Diagnostics.EventLog cukup tepat.

Untuk bekerja dengan log, Anda dapat menggunakan metode yang sesuai:

$AppLog | Get-Member -MemberType Method

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Katakanlah itu dibersihkan dengan metode Clear() jika ada hak akses:

$AppLog.Clear()

Cmdlet Objek Baru juga digunakan untuk bekerja dengan komponen COM. Jumlahnya cukup banyak - mulai dari perpustakaan yang disertakan dengan server skrip Windows hingga aplikasi ActiveX, seperti Internet Explorer. Untuk membuat objek COM, Anda perlu mengatur parameter -ComObject dengan ProgId terprogram dari kelas yang diinginkan:

New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

Untuk membuat objek Anda sendiri dengan struktur arbitrer, penggunaan Objek Baru terlihat terlalu kuno dan rumit; cmdlet ini digunakan untuk bekerja dengan komponen perangkat lunak di luar PowerShell. Pada artikel mendatang masalah ini akan dibahas lebih detail. Selain objek .NET dan COM, kita juga akan mengeksplorasi objek CIM (WMI) dan ADSI.

Memanggil Metode Statis

Beberapa kelas .NET Core tidak dapat dipakai, termasuk System.Environment dan System.Math. Mereka statis dan hanya berisi properti dan metode statis. Ini pada dasarnya adalah perpustakaan referensi yang digunakan tanpa membuat objek. Anda dapat merujuk ke kelas statis melalui literal dengan mengapit nama tipe dalam tanda kurung siku. Namun, jika kita melihat struktur objek menggunakan Get-Member, kita akan melihat tipe System.RuntimeType alih-alih System.Environment:

[System.Environment] | Get-Member

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Untuk melihat anggota statis saja, panggil Get-Member dengan parameter -Static (perhatikan tipe objek):

[System.Environment] | Get-Member -Static

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Untuk mengakses properti dan metode statis, gunakan dua titik dua berturut-turut, bukan titik setelah literal:

[System.Environment]::OSVersion

Atau

$test=[System.Math]::Sqrt(25) 
$test
$test.GetType()

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Ketik PSCustomObject

Di antara banyak tipe data yang tersedia di PowerShell, perlu disebutkan PSCustomObject, yang dirancang untuk menyimpan objek dengan struktur arbitrer. Membuat objek seperti itu menggunakan cmdlet Objek Baru dianggap sebagai cara klasik, namun rumit dan ketinggalan jaman:

$object = New-Object  –TypeName PSCustomObject -Property @{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'}

Mari kita lihat struktur objeknya:

$object | Get-Member

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Dimulai dengan PowerShell 3.0, sintaks lain tersedia:

$object = [PSCustomObject]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

Anda dapat mengakses data dengan salah satu cara yang setara:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Berikut ini contoh mengonversi tabel hash yang ada menjadi objek:

$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Salah satu kelemahan objek jenis ini adalah urutan propertinya dapat berubah. Untuk menghindari hal ini, Anda harus menggunakan atribut [ordered]:

$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

Ada opsi lain untuk membuat objek: di atas kita melihat menggunakan cmdlet Pilih-Obyek. Yang tersisa hanyalah memikirkan penambahan dan penghapusan elemen. Melakukan hal ini untuk objek dari contoh sebelumnya cukup sederhana:

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

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Cmdlet Add-Member memungkinkan Anda untuk menambahkan tidak hanya properti, tetapi juga metode ke $object yang dibuat sebelumnya dengan menggunakan konstruksi "-MemberType ScriptMethod":

$ScriptBlock = {
    # код 
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member

Harap perhatikan bahwa kami menggunakan variabel $ScriptBlock bertipe ScriptBlock untuk menyimpan kode metode baru.

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Untuk menghapus properti, gunakan metode yang sesuai:

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

Membuat Kelas Anda Sendiri

PowerShell 5.0 memperkenalkan kemampuan untuk mendefinisikan nilai menggunakan karakteristik sintaksis bahasa pemrograman berorientasi objek. Kata layanan Kelas dimaksudkan untuk ini, setelah itu Anda harus menentukan nama kelas dan menjelaskan isi kelasnya dalam tanda kurung operator:

class MyClass
{
    # тело класса
}

Ini adalah tipe .NET Core yang sebenarnya, dengan isi yang menjelaskan properti, metode, dan elemen lainnya. Mari kita lihat contoh mendefinisikan kelas paling sederhana:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
}

Untuk membuat objek (contoh kelas), gunakan cmdlet Objek Baru, atau literal bertipe [MyClass] dan metode pseudostatik baru (konstruktor default):

$object = New-Object -TypeName MyClass

или

$object = [MyClass]::new()

Mari kita analisa struktur objeknya:

$object | Get-Member

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Jangan lupa tentang cakupan: Anda tidak bisa merujuk ke nama tipe sebagai string atau menggunakan tipe literal di luar skrip atau modul tempat kelas ditentukan. Dalam hal ini, fungsi dapat mengembalikan instance kelas (objek) yang dapat diakses di luar modul atau skrip.

Setelah membuat objek, isi propertinya:

$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Perhatikan bahwa deskripsi kelas tidak hanya menentukan tipe properti, tetapi juga nilai defaultnya:

class Example
{
     [string]$Name = 'John Doe'
}

Deskripsi metode kelas menyerupai deskripsi suatu fungsi, tetapi tanpa menggunakan kata fungsi. Seperti dalam suatu fungsi, parameter diteruskan ke metode jika diperlukan:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
     
     #описание метода
     Smile([bool]$param1)
     {
         If($param1) {
            Write-Host ':)'
         }
     }
}

Sekarang perwakilan kelas kita bisa tersenyum:

$object = [MyClass]::new()
$object.Smile($true)

Metode dapat kelebihan beban; sebagai tambahan, sebuah kelas memilikinya properti dan metode statis, serta konstruktor yang namanya sesuai dengan nama kelas itu sendiri. Kelas yang ditentukan dalam skrip atau modul PowerShell dapat berfungsi sebagai basis untuk kelas lain - beginilah cara pewarisan diimplementasikan. Dalam hal ini, diperbolehkan menggunakan kelas .NET yang ada sebagai kelas dasar:

class MyClass2 : MyClass
{
      #тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)

Deskripsi kami tentang bekerja dengan objek di PowerShell tidaklah lengkap. Dalam publikasi berikut, kami akan mencoba memperdalamnya dengan contoh-contoh praktis: artikel kelima dalam seri ini akan membahas masalah integrasi PowerShell dengan komponen perangkat lunak pihak ketiga. Bagian sebelumnya dapat ditemukan di tautan di bawah.

Bagian 1: Fitur Dasar Windows PowerShell
Bagian 2: Pengenalan Bahasa Pemrograman Windows PowerShell
Bagian 3: meneruskan parameter ke skrip dan fungsi, membuat cmdlet

Apa itu Windows PowerShell dan kegunaannya? Bagian 4: Bekerja dengan objek, memiliki kelas

Sumber: www.habr.com

Tambah komentar