Apa itu Windows PowerShell dan apa yang dimakannya? Bagian 4: Bekerja dengan objek, kelas khusus



Output teks dari perintah di jendela interpreter PowerShell hanyalah cara untuk menampilkan informasi dalam bentuk yang dapat dibaca manusia. Bahkan, lingkungan difokuskan pada bekerja dengan objek: cmdlet dan fungsi menerimanya pada input dan kembali pada output , dan jenis variabel yang tersedia dalam mode interaktif dan skrip didasarkan pada kelas .NET. Pada artikel keempat dari siklus, kita akan belajar bekerja dengan objek secara lebih rinci.

Daftar Isi:


PowerShell




ForEach-Object, Group-Object Measure-Object
.NET COM (New-Object)

PSCustomObject


PowerShell


Ingat bahwa suatu objek adalah kumpulan bidang data (properti, peristiwa, dll.) Dan metode pengolahannya (metode). Strukturnya ditentukan oleh jenisnya, 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 PowerShell, objek dapat dikirimkan sebagai argumen untuk fungsi dan cmdlet, nilai yang ditetapkan ke variabel, dan ada juga mekanisme untuk menyusun perintah (pipa atau pipa). Setiap perintah dalam pipa melewati outputnya ke yang berikutnya secara bergantian - objek demi objek. Untuk pemrosesan, Anda dapat menggunakan cmdlet yang dikompilasi atau membuat fungsi-fungsi lanjutan Anda sendiriuntuk melakukan berbagai manipulasi dengan objek dalam pipa: memfilter, menyortir, mengelompokkan, dan bahkan mengubah strukturnya. Transfer data dalam formulir ini memiliki keuntungan serius: tim penerima tidak perlu mengurai aliran byte (teks), semua informasi yang diperlukan mudah diekstraksi dengan merujuk pada properti dan metode yang sesuai.

Lihat struktur objek


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



Ini menampilkan beberapa data teks yang diformat yang tidak memberikan gambaran tentang properti dari objek yang dikembalikan dan metode mereka. Untuk menyempurnakan output, Anda perlu mempelajari cara memeriksa struktur objek, dan cmdlet Get-Member akan membantu kami dengan ini:

Get-Process | Get-Member



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

Get-Process | Get-Member -MemberType Property

Pengetahuan ini akan diperlukan untuk menyelesaikan tugas-tugas administratif secara interaktif atau untuk menulis skrip Anda sendiri: katakanlah, untuk mendapatkan informasi tentang proses yang digantung oleh properti yang Menanggapi.

Penyaringan Objek


PowerShell memungkinkan Anda untuk menyalurkan objek yang memenuhi kondisi tertentu:

Where-Object {   }

Hasil dari eksekusi blok skrip di kurung operator harus menjadi nilai logis. Jika itu benar ($ true), objek yang memasuki cmdlet Where-Object akan diteruskan ke pipa, jika tidak (nilai $ false) itu akan dihapus. Misalnya, kami mencantumkan layanan Windows Server yang dihentikan, mis. yang dengan properti Status diatur ke Berhenti:

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



Di sini kita kembali melihat representasi tekstual, tetapi jika Anda ingin memahami jenis dan struktur internal objek yang melewati pipa, mudah:

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



Sortir Objek


Saat pipelining objek, seringkali perlu untuk menyortirnya. Nama properti (kunci sortir) dilewatkan ke cmdlet Sort-Object, dan mengembalikan objek yang dipesan berdasarkan nilainya. Output dari proses yang berjalan dapat dengan mudah diurutkan berdasarkan waktu prosesor yang dihabiskan (properti cpu):

Get-Process | Sort-Object –Property cpu

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

Get-Process | Sort-Object cpu -Descending



Pemilihan objek dan bagian-bagiannya


Cmdlet Select-Object memungkinkan Anda untuk memilih sejumlah objek tertentu di awal atau di akhir pipa menggunakan parameter -First atau -Last. Dengannya, Anda dapat memilih objek tunggal atau properti tertentu, serta membuat objek baru berdasarkan basisnya. Mari kita lihat pekerjaan 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



Anda dapat memilih hanya properti tertentu dari objek yang melewati pipa dan membuat yang baru atas dasar mereka:

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

Sebagai hasil dari pipeline, kita akan mendapatkan objek baru, struktur yang akan berbeda dari struktur yang dikembalikan oleh cmdlet Get-Process. Kami akan memverifikasi ini menggunakan Get-Member:

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



Perhatikan bahwa Select-Object mengembalikan objek tunggal (-Pertama 1), yang hanya memiliki dua bidang yang ditentukan oleh kami: nilainya disalin dari objek pertama yang dilewatkan ke pipa dengan cmdlet Get-Process. Menggunakan Select-Object, salah satu cara untuk membuat objek di skrip PowerShell didasarkan:

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



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

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



Mari kita lihat struktur benda yang melewati pipa:

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



ForEach-Object, Group-Object dan Measure-Object


Ada cmdlet lain untuk bekerja dengan objek. Sebagai contoh, kita akan berbicara tentang tiga yang paling berguna:

ForEach-Object memungkinkan Anda untuk mengeksekusi kode PowerShell untuk setiap objek di dalam pipa:

ForEach-Object {   }

Grup-Objek mengelompokkan objek berdasarkan nilai properti:

Group-Object PropertyName

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

Measure-Object mengagregasi berbagai parameter ringkasan dengan nilai-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 dipertimbangkan digunakan secara interaktif, dan skrip sering membuat fungsi dengan blok Begin, Process, dan End.

Membuat .NET dan COM Objects (New-Object)


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

New-Object -TypeName System.Diagnostics.EventLog



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

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



Harap dicatat: kami menyimpan output dari perintah dalam variabel $ AppLog. Meskipun jalur pipa umumnya digunakan dalam mode interaktif, skrip seringkali membutuhkan pemeliharaan referensi ke objek. Selain itu, kelas .NET Core utama terdapat dalam System namespace: PowerShell mencari secara default untuk tipe yang ditentukan di dalamnya, jadi tulislah Diagnostics.EventLog sebagai ganti System.Diagnostics.EventLog cukup benar.

Untuk bekerja dengan jurnal, Anda dapat merujuk ke metode yang sesuai:

$AppLog | Get-Member -MemberType Method



Katakanlah itu dihapus menggunakan metode Clear () dengan hak akses:

$AppLog.Clear()

Cmdlet Objek Baru juga digunakan untuk bekerja dengan komponen COM. Ada cukup banyak dari mereka - dari perpustakaan yang disediakan dengan server scripting Windows ke aplikasi ActiveX, seperti, misalnya, Internet Explorer. Untuk membuat objek COM, Anda perlu menentukan parameter -ComObject dengan ProgId pengidentifikasi program 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 sewenang-wenang, menggunakan New-Object terlihat terlalu kuno dan rumit; cmdlet ini digunakan untuk bekerja dengan komponen perangkat lunak di luar PowerShell. Dalam artikel selanjutnya, masalah ini akan dibahas lebih detail. Selain objek .NET dan COM, kita juga akan belajar tentang objek CIM (WMI) dan ADSI.

Memanggil Metode Statis


Tidak dimungkinkan untuk membuat contoh dari beberapa kelas .NET Core: ini termasuk System.Environment dan System.Math. Mereka statis dan hanya berisi properti dan metode statis. Intinya, ini adalah pustaka referensi yang digunakan tanpa membuat objek. Anda bisa merujuk ke kelas statis melalui literal, melampirkan nama jenis dalam tanda kurung. Selain itu, jika Anda melihat struktur objek menggunakan Get-Member, kita akan melihat tipe System.RuntimeType alih-alih System.Environment:

[System.Environment] | Get-Member



Untuk hanya melihat elemen statis, Anda perlu memanggil Get-Member dengan parameter -Static (perhatikan jenis objek):

[System.Environment] | Get-Member -Static



Untuk mengakses properti dan metode statis, dua titik dua berturut-turut digunakan sebagai ganti periode setelah literal:

[System.Environment]::OSVersion

Atau

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



Ketik PSCustomObject


Di antara banyak tipe data yang tersedia di PowerShell, ada baiknya menyebutkan PSCustomObject, yang dirancang untuk menyimpan objek dengan struktur sewenang-wenang. 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 objek:

$object | Get-Member



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 adalah contoh mengubah tabel hash yang ada menjadi objek:

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



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

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

Ada opsi lain untuk membuat objek: di atas kami memeriksa penggunaan cmdlet Select-Object . Masih berurusan dengan penambahan dan penghapusan elemen. Untuk melakukan ini untuk objek dari contoh sebelumnya cukup sederhana:

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



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

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

Catatan: untuk menyimpan kode untuk metode baru, kami menggunakan variabel $ ScriptBlock dari tipe ScriptBlock.



Untuk menghapus properti, gunakan metode yang sesuai:

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

Membuat Kelas Anda Sendiri


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

class MyClass
{
    #  
}

Ini adalah tipe sebenarnya dari .NET Core, bagian yang menggambarkan properti, metode, dan elemen lainnya. Pertimbangkan contoh definisi kelas sederhana:

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

Untuk membuat objek (turunan dari sebuah kelas), gunakan cmdlet Objek-Baru atau literal dari tipe [MyClass] dan metode baru pseudostatik (konstruktor default):

$object = New-Object -TypeName MyClass

atau

$object = [MyClass]::new()

Mari kita menganalisis struktur objek:

$object | Get-Member



Jangan lupa tentang ruang lingkup: Anda tidak bisa menyebut nama tipe sebagai string atau menggunakan tipe literal di luar skrip atau modul di mana kelas didefinisikan. Pada saat yang sama, fungsi dapat mengembalikan instance kelas (objek) yang akan tersedia di luar modul atau skrip.

Setelah membuat objek, isi propertinya:

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



Perhatikan bahwa dalam deskripsi kelas tidak hanya tipe properti yang ditetapkan, tetapi juga nilai defaultnya:

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

Deskripsi metode kelas menyerupai deskripsi fungsi, tetapi tanpa menggunakan fungsi kata fungsi. Seperti pada fungsi, parameter dilewatkan ke metode, jika perlu:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
     
     # 
     Smile([bool]$param1)
     {
         If($param1) {
            Write-Host ':)'
         }
     }
}

Sekarang perwakilan dari kelas kami tahu bagaimana caranya tersenyum:

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

Metode dapat kelebihan beban, di samping itu, kelas memiliki sifat dan metode statis , serta konstruktor yang namanya bertepatan dengan nama kelas itu sendiri. Kelas yang didefinisikan dalam skrip atau modul PowerShell dapat berfungsi sebagai basis untuk yang lain - ini adalah bagaimana warisan diimplementasikan. Pada saat yang sama, penggunaan kelas .NET yang ada diizinkan sebagai basis:

class MyClass2 : MyClass
{
      #  ,     MyClass
}
[MyClass2]::new().Smile($true)

Deskripsi kami tentang bekerja dengan objek di PowerShell hampir tidak lengkap. Dalam publikasi berikut, kami akan mencoba memperdalamnya dengan contoh-contoh praktis: artikel kelima dalam seri akan dikhususkan untuk masalah mengintegrasikan PowerShell dengan komponen perangkat lunak pihak ketiga. Bagian yang lalu dapat ditemukan di tautan di bawah ini.



1: Windows PowerShell
2: Windows PowerShell
3: ,


All Articles