Output teks dari perintah di jendela juru bahasa PowerShell hanyalah cara untuk menampilkan informasi dalam bentuk yang sesuai dengan persepsi manusia. Sebenarnya hari Rabu
contoh:
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
Melihat struktur benda
Misalnya, jalankan cmdlet Get-Process, yang memungkinkan Anda memperoleh informasi tentang proses yang berjalan di sistem:
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
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"}
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
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
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
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
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()
Menggunakan Select-Object, Anda dapat menambahkan properti terhitung ke objek yang perlu direpresentasikan sebagai
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Mari kita lihat struktur benda yang melewati conveyor:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
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.
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
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
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
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
[System.Environment] | Get-Member
Untuk melihat anggota statis saja, panggil Get-Member dengan parameter -Static (perhatikan tipe objek):
[System.Environment] | Get-Member -Static
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()
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
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()
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
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
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.
Untuk menghapus properti, gunakan metode yang sesuai:
$object.psobject.properties.remove('Name')
Membuat Kelas Anda Sendiri
PowerShell 5.0 memperkenalkan kemampuan untuk mendefinisikan
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
$object = New-Object -TypeName MyClass
или
$object = [MyClass]::new()
Mari kita analisa struktur objeknya:
$object | Get-Member
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
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
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.
Sumber: www.habr.com