Bagikan melalui


Membuat Cmdlet tanpa Parameter

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.

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.

  1. Mulai Windows PowerShell, dan dapatkan proses saat ini yang berjalan pada komputer.

    Get-Proc
    

    Output 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
    ...
    
  2. Tetapkan variabel ke hasil cmdlet untuk manipulasi yang lebih mudah.

    $p=Get-Proc
    
  3. Dapatkan jumlah proses.

    $p.Length
    

    Output berikut muncul.

    63
    
  4. Ambil 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  rundll32
    
  5. Dapatkan waktu mulai proses ini.

    $p[6].StartTime
    

    Output berikut muncul.

    Tuesday, July 26, 2005 9:34:15 AM
    
    $p[6].StartTime.DayOfYear
    
    207
    
  6. Dapatkan proses yang jumlah handelnya lebih besar dari 500, dan urutkan hasilnya.

    $p | Where-Object {$_.HandleCount -gt 500 } | Sort-Object HandleCount
    

    Output 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
    ...
    
  7. Gunakan cmdlet Get-Member untuk mencantumkan properti yang tersedia untuk setiap proses.

    $p | Get-Member -MemberType Property
    
        TypeName: System.Diagnostics.Process
    

    Output 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

Cara Kerja Windows PowerShell

Cara Mendaftarkan Cmdlet, Penyedia, dan Aplikasi Host

Referensi Windows PowerShell

Sampel Cmdlet