Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Bagian ini menjelaskan cara membuat cmdlet yang mengambil informasi dari komputer lokal tanpa menggunakan parameter, lalu menulis informasi ke alur. Cmdlet yang dijelaskan di sini adalah cmdlet Get-Proc yang mengambil informasi tentang proses komputer lokal, lalu menampilkan informasi tersebut di baris perintah.
Nota
Ketahuilah bahwa saat menulis cmdlet, rakitan referensi Windows PowerShell® diunduh ke disk (secara default di C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0). Mereka tidak diinstal di Global Assembly Cache (GAC).
Penamaan Cmdlet
Nama cmdlet terdiri dari kata kerja yang menunjukkan tindakan yang diambil cmdlet dan kata benda yang menunjukkan item yang ditindaklanjuti cmdlet. Karena cmdlet Get-Proc sampel ini mengambil objek proses, ia menggunakan kata kerja "Dapatkan", yang ditentukan oleh System.Management.Automation.VerbsCommon enumerasi, dan kata benda "Proc" untuk menunjukkan bahwa cmdlet berfungsi pada item proses.
Saat penamaan cmdlet, jangan gunakan salah satu karakter berikut: # , () {} [] & - /\ $ ; " '<> | ? @ ` .
Memilih Kata Benda
Anda harus memilih kata benda yang spesifik. Yang terbaik adalah menggunakan kata benda tunggal yang diawali dengan versi nama produk yang dipersingkat. Contoh nama cmdlet jenis ini adalah "Get-SQLServer".
Memilih Kata Kerja
Anda harus menggunakan kata kerja dari kumpulan nama kata kerja cmdlet yang disetujui. Untuk informasi selengkapnya tentang kata kerja cmdlet yang disetujui, lihat Nama Kata Kerja Cmdlet.
Menentukan Kelas Cmdlet
Setelah Anda memilih nama cmdlet, tentukan kelas .NET untuk mengimplementasikan cmdlet. Berikut adalah definisi kelas untuk cmdlet Get-Proc sampel ini:
[Cmdlet(VerbsCommon.Get, "Proc")]
public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
Inherits Cmdlet
Perhatikan bahwa sebelumnya untuk definisi kelas, atribut System.Management.Automation.CmdletAttribute, dengan sintaks [Cmdlet(verb, noun, ...)], digunakan untuk mengidentifikasi kelas ini sebagai cmdlet. Ini adalah satu-satunya atribut yang diperlukan untuk semua cmdlet, dan memungkinkan runtime Windows PowerShell untuk memanggilnya dengan benar. Anda dapat mengatur kata kunci atribut untuk mendeklarasikan kelas lebih lanjut jika perlu. Ketahuilah bahwa deklarasi atribut untuk sampel kelas GetProcCommand kami hanya mendeklarasikan nama kata benda dan kata kerja untuk cmdlet Get-Proc.
Nota
Untuk semua kelas atribut Windows PowerShell, kata kunci yang dapat Anda atur sesuai dengan properti kelas atribut.
Saat menamai kelas cmdlet, adalah praktik yang baik untuk mencerminkan nama cmdlet dalam nama kelas. Untuk melakukan ini, gunakan formulir "VerbNounCommand" dan ganti "Verb" dan "Noun" dengan kata kerja dan kata benda yang digunakan dalam nama cmdlet. Seperti yang ditunjukkan dalam definisi kelas sebelumnya, cmdlet Get-Proc sampel mendefinisikan kelas yang disebut GetProcCommand, yang berasal dari kelas dasar System.Management.Automation.Cmdlet.
Penting
Jika Anda ingin menentukan cmdlet yang mengakses runtime Windows PowerShell secara langsung, kelas .NET Anda harus berasal dari System.Management.Automation.PSCmdlet kelas dasar. Untuk informasi selengkapnya tentang kelas ini, lihat Membuat Cmdlet yang Menentukan Set Parameter.
Nota
Kelas untuk cmdlet harus secara eksplisit ditandai sebagai publik. Kelas yang tidak ditandai sebagai publik akan default ke internal dan tidak akan ditemukan oleh runtime Windows PowerShell.
Windows PowerShell menggunakan namespace Microsoft.PowerShell.Commands untuk kelas cmdletnya. Disarankan untuk menempatkan kelas cmdlet Anda di namespace layanan Perintah namespace API Anda, misalnya, xxx.PS. Perintah.
Mengesampingkan Metode Pemrosesan Input
Kelas System.Management.Automation.Cmdlet menyediakan tiga metode pemrosesan input utama, setidaknya salah satu cmdlet Anda harus mengambil alih. Untuk informasi selengkapnya tentang cara Windows PowerShell memproses rekaman, lihat Cara Kerja Windows PowerShell.
Untuk semua jenis input, runtime Windows PowerShell memanggil System.Management.Automation.Cmdlet.BeginProcessing untuk mengaktifkan pemrosesan. Jika cmdlet Anda harus melakukan beberapa pra-pemrosesan atau penyiapan, cmdlet dapat melakukan ini dengan mengesampingkan metode ini.
Nota
Windows PowerShell menggunakan istilah "rekaman" untuk menjelaskan kumpulan nilai parameter yang disediakan saat cmdlet dipanggil.
Jika cmdlet Anda menerima input alur, cmdlet harus mengambil alih metode System.Management.Automation.Cmdlet.ProcessRecord, dan secara opsional metode System.Management.Automation.Cmdlet.EndProcessing. Misalnya, cmdlet mungkin mengambil alih kedua metode jika mengumpulkan semua input menggunakan System.Management.Automation.Cmdlet.ProcessRecord dan kemudian beroperasi pada input secara keseluruhan daripada satu elemen pada satu waktu, seperti yang dilakukan cmdlet Sort-Object.
Jika cmdlet Anda tidak mengambil input alur, cmdlet harus mengambil alih metode System.Management.Automation.Cmdlet.EndProcessing. Ketahuilah bahwa metode ini sering digunakan sebagai pengganti System.Management.Automation.Cmdlet.BeginProcessing ketika cmdlet tidak dapat beroperasi pada satu elemen pada satu waktu, seperti halnya untuk cmdlet pengurutan.
Karena cmdlet Get-Proc sampel ini harus menerima input alur, sampel ini mengambil alih metode System.Management.Automation.Cmdlet.ProcessRecord dan menggunakan implementasi default untuk System.Management.Automation.Cmdlet.BeginProcessing dan System.Management.Automation.Cmdlet.EndProcessing. System.Management.Automation.Cmdlet.ProcessRecord mengambil proses dan menulisnya ke baris perintah menggunakan metode System.Management.Automation.Cmdlet.WriteObject.
protected override void ProcessRecord()
{
// Get the current processes
Process[] processes = Process.GetProcesses();
// Write the processes to the pipeline making them available
// to the next cmdlet. The second parameter of this call tells
// PowerShell to enumerate the array, and send one process at a
// time to the pipeline.
WriteObject(processes, true);
}
Protected Overrides Sub ProcessRecord()
'/ Get the current processes.
Dim processes As Process()
processes = Process.GetProcesses()
'/ Write the processes to the pipeline making them available
'/ to the next cmdlet. The second parameter of this call tells
'/ PowerShell to enumerate the array, and send one process at a
'/ time to the pipeline.
WriteObject(processes, True)
End Sub 'ProcessRecord
Hal-hal yang Perlu Diingat Tentang Pemrosesan Input
Sumber default untuk input adalah objek eksplisit (misalnya, string) yang disediakan oleh pengguna pada baris perintah. Untuk informasi selengkapnya, lihat Membuat Cmdlet untuk Memproses Input Baris Perintah.
Metode pemrosesan input juga dapat menerima input dari objek output cmdlet upstram pada alur. Untuk informasi selengkapnya, lihat Membuat Cmdlet untuk Memproses Input Alur. Ketahuilah bahwa cmdlet Anda dapat menerima input dari kombinasi sumber baris perintah dan alur.
Cmdlet hilir mungkin tidak kembali untuk waktu yang lama, atau tidak sama sekali. Untuk alasan itu, metode pemrosesan input di cmdlet Anda tidak boleh menahan kunci selama panggilan ke System.Management.Automation.Cmdlet.WriteObject, terutama kunci yang cakupannya meluas di luar instans cmdlet.
Penting
Cmdlet tidak boleh memanggil System.Console.Writeline* atau yang setara.
- Cmdlet Anda mungkin memiliki variabel objek untuk dibersihkan ketika selesai diproses (misalnya, jika membuka handel file di metode System.Management.Automation.Cmdlet.BeginProcessing dan menjaga handel terbuka untuk digunakan oleh System.Management.Automation.Cmdlet.ProcessRecord). Penting untuk diingat bahwa runtime Windows PowerShell tidak selalu memanggil metode System.Management.Automation.Cmdlet.EndProcessing, yang harus melakukan pembersihan objek.
Misalnya, System.Management.Automation.Cmdlet.EndProcessing mungkin tidak dipanggil jika cmdlet dibatalkan di tengah jalan atau jika kesalahan penghentian terjadi di bagian mana pun dari cmdlet. Oleh karena itu, cmdlet yang memerlukan pembersihan objek harus menerapkan pola System.IDisposable lengkap, termasuk finalizer, sehingga runtime dapat memanggil System.Management.Automation.Cmdlet.EndProcessing dan System.IDisposable.Dispose* di akhir pemrosesan.
Sampel Kode
Untuk kode sampel C# lengkap, lihat Sampel GetProcessSample01.
Menentukan Tipe objek dan Pemformatan
Windows PowerShell meneruskan informasi antar cmdlet menggunakan objek .NET. Akibatnya, cmdlet mungkin perlu menentukan jenisnya sendiri, atau cmdlet mungkin perlu memperluas jenis yang ada yang disediakan oleh cmdlet lain. Untuk informasi selengkapnya tentang menentukan jenis baru atau memperluas jenis yang sudah ada, lihat Memperluas Tipe Objek dan Pemformatan.
Membangun Cmdlet
Setelah menerapkan cmdlet, Anda harus mendaftarkannya dengan Windows PowerShell melalui snap-in Windows PowerShell. Untuk informasi selengkapnya tentang mendaftarkan cmdlet, lihat Cara Mendaftarkan Cmdlet, Penyedia, dan Aplikasi Host.
Menguji Cmdlet
Ketika cmdlet Anda telah terdaftar di Windows PowerShell, Anda dapat mengujinya dengan menjalankannya di baris perintah. Kode untuk sampel kami Get-Proc cmdlet kecil, tetapi masih menggunakan runtime Windows PowerShell dan objek .NET yang ada, yang cukup untuk membuatnya berguna. Mari kita uji untuk lebih memahami apa yang dapat Get-Proc lakukan dan bagaimana outputnya dapat digunakan. Untuk informasi selengkapnya tentang menggunakan cmdlet dari baris perintah, lihat Memulai Windows PowerShell.
Mulai Windows PowerShell, dan dapatkan proses saat ini yang berjalan pada komputer.
Get-ProcOutput berikut muncul.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ---------- 254 7 7664 12048 66 173.75 1200 QCTRAY 32 2 1372 2628 31 0.04 1860 DLG 271 6 1216 3688 33 0.03 3816 lg 27 2 560 1920 24 0.01 1768 TpScrex ...Tetapkan variabel ke hasil cmdlet untuk manipulasi yang lebih mudah.
$p=Get-ProcDapatkan jumlah proses.
$p.LengthOutput berikut muncul.
63Ambil proses tertentu.
$p[6]Output berikut muncul.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 1033 3 2400 3336 35 0.53 1588 rundll32Dapatkan waktu mulai proses ini.
$p[6].StartTimeOutput berikut muncul.
Tuesday, July 26, 2005 9:34:15 AM$p[6].StartTime.DayOfYear207Dapatkan proses yang jumlah handelnya lebih besar dari 500, dan urutkan hasilnya.
$p | Where-Object {$_.HandleCount -gt 500 } | Sort-Object HandleCountOutput berikut muncul.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ---------- 568 14 2164 4972 39 5.55 824 svchost 716 7 2080 5332 28 25.38 468 csrss 761 21 33060 56608 440 393.56 3300 WINWORD 791 71 7412 4540 59 3.31 492 winlogon ...Gunakan cmdlet
Get-Memberuntuk mencantumkan properti yang tersedia untuk setiap proses.$p | Get-Member -MemberType PropertyTypeName: System.Diagnostics.ProcessOutput berikut muncul.
Name MemberType Definition ---- ---------- ---------- BasePriority Property System.Int32 BasePriority {get;} Container Property System.ComponentModel.IContainer Conta... EnableRaisingEvents Property System.Boolean EnableRaisingEvents {ge... ...
Lihat Juga
Membuat Cmdlet untuk Memproses Input Baris Perintah
Membuat Cmdlet untuk Memproses Input Alur
Cara Membuat Cmdlet Windows PowerShell
Memperluas Tipe Objek dan Pemformatan