Parametreler Olmadan Cmdlet Oluşturma


Bu bölümde, parametreleri kullanmadan yerel bilgisayardan bilgi alan ve ardından bilgileri ardışık düzene yazan bir cmdlet'in nasıl oluşturulacağı açıklanmaktadır. Burada açıklanan cmdlet, yerel bilgisayarın işlemleri hakkında bilgi alan ve daha sonra bu bilgiyi komut satırında görüntüleyen bir Get-Proc cmdlet'idir.

Not

Cmdlet'leri yazarken Windows PowerShell® referans derlemelerinin diske indirildiğini unutmayın (varsayılan olarak C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0 konumunda). Global Assembly Cache'e (GAC) kurulmazlar.

Cmdlet'i adlandırma

Bir cmdlet adı, cmdlet'in gerçekleştirdiği eylemi belirten bir fiil ve cmdlet'in üzerinde işlem yaptığı öğeleri belirten bir isimden oluşur. Bu örnek Get-Proc cmdlet'i işlem nesnelerini aldığından, System.Management.Automation.Verbscommon numaralandırması tarafından tanımlanan "Get" fiilini ve cmdlet'in işlem öğeleri üzerinde çalıştığını belirtmek için "Proc" adını kullanır.

Cmdlet'leri adlandırırken aşağıdaki karakterlerden hiçbirini kullanmayın: # ,() {} [] & - /\ $; : " '<> | ? @ ` .

Bir İsim Seçmek

Spesifik bir isim seçmelisiniz. Ürün adının kısaltılmış versiyonunun ön ekiyle tekil bir isim kullanmak en iyisidir. Bu türden örnek bir cmdlet adı "Get-SQLServer"dır.

Bir Fiil Seçmek

Onaylanmış cmdlet fiil adları kümesinden bir fiil kullanmalısınız. Onaylanan cmdlet fiilleri hakkında daha fazla bilgi için bkz. Cmdlet Fiil Adları.

Cmdlet Sınıfını Tanımlama

Bir cmdlet adı seçtikten sonra cmdlet'i uygulamak için bir .NET sınıfı tanımlayın. Bu örnek Get-Proc cmdlet'inin sınıf tanımı şöyledir:

[Cmdlet(VerbsCommon.Get, "Proc")]
  public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
    Inherits Cmdlet

Sınıf tanımından önce, bu sınıfı bir cmdlet olarak tanımlamak için [Cmdlet(verb, noun, ...)] sözdizimine sahip System.Management.Automation.CmdletAttribute özniteliğinin kullanıldığına dikkat edin. . Bu, tüm cmdlet'ler için gerekli olan tek özelliktir ve Windows PowerShell çalışma zamanının bunları doğru şekilde çağırmasına olanak tanır. Gerekirse sınıfı daha fazla bildirmek için nitelik anahtar sözcüklerini ayarlayabilirsiniz. Örnek GetProcCommand sınıfımızın öznitelik bildiriminin, Get-Proc cmdlet'inin yalnızca isim ve fiil adlarını bildirdiğini unutmayın.

Not

Tüm Windows PowerShell öznitelik sınıfları için ayarlayabileceğiniz anahtar sözcükler, öznitelik sınıfının özelliklerine karşılık gelir.

Cmdlet'in sınıfını adlandırırken cmdlet adını sınıf adına yansıtmak iyi bir uygulamadır. Bunu yapmak için "VerbNounCommand" formunu kullanın ve "Fiil" ve "İsim" kelimelerini cmdlet adında kullanılan fiil ve isimle değiştirin. Önceki sınıf tanımında gösterildiği gibi, örnek Get-Proc cmdlet'i, System.Management.Automation.Cmdlet temel sınıfından türetilen GetProcCommand adlı bir sınıfı tanımlar.

Bu önemli

Windows PowerShell çalışma zamanına doğrudan erişen bir cmdlet tanımlamak istiyorsanız .NET sınıfınızın System.Management.Automation.PSCmdlet temel sınıfından türetilmesi gerekir. Bu sınıf hakkında daha fazla bilgi için bkz. Parametre Kümelerini Tanımlayan Bir Cmdlet Oluşturma.

Not

Bir cmdlet'in sınıfı açıkça genel olarak işaretlenmelidir. Genel olarak işaretlenmeyen sınıflar varsayılan olarak dahili olacaktır ve Windows PowerShell çalışma zamanı tarafından bulunamaz.

Windows PowerShell, cmdlet sınıfları için Microsoft.PowerShell.Commands ad alanını kullanır. Cmdlet sınıflarınızı API ad alanınızın Komutlar ad alanına (örneğin, xxx.PS.Commands) yerleştirmeniz önerilir.

Giriş İşleme Yöntemini Geçersiz Kılma

System.Management.Automation.Cmdlet sınıfı üç ana giriş işleme yöntemi sağlar ve bunlardan en az birinin cmdlet'inizin geçersiz kılınması gerekir. Windows PowerShell'in kayıtları nasıl işlediği hakkında daha fazla bilgi için bkz. Windows PowerShell Nasıl Çalışır?

Tüm giriş türleri için Windows PowerShell çalışma zamanı, işlemeyi etkinleştirmek için System.Management.Automation.Cmdlet.BeginProcessing'i çağırır. Cmdlet'inizin bazı ön işleme veya kurulum yapması gerekiyorsa, bunu bu yöntemi geçersiz kılarak yapabilir.

Not

Windows PowerShell, bir cmdlet çağrıldığında sağlanan parametre değerleri kümesini tanımlamak için "kayıt" terimini kullanır.

Cmdlet'iniz işlem hattı girişini kabul ediyorsa System.Management.Automation.Cmdlet.ProcessRecord yöntemini ve isteğe bağlı olarak System.Management.Automation.Cmdlet.EndProcessing yöntemini geçersiz kılmalıdır. Örneğin, bir cmdlet, tüm girdiyi System.Management.Automation.Cmdlet.ProcessRecord kullanarak topluyorsa ve ardından Sort-Object olarak girdi üzerinde tek seferde bir öğe yerine bir bütün olarak çalışıyorsa her iki yöntemi de geçersiz kılabilir. cmdlet bunu yapar.

Cmdlet'iniz ardışık düzen girişi almıyorsa System.Management.Automation.Cmdlet.EndProcessing yöntemini geçersiz kılmalıdır. Bu yöntemin, sıralama cmdlet'inde olduğu gibi cmdlet'in aynı anda tek bir öğe üzerinde çalışamadığı durumlarda System.Management.Automation.Cmdlet.BeginProcessing yerine sıklıkla kullanıldığını unutmayın.

Bu örnek Get-Proc cmdlet'inin ardışık düzen girişi alması gerektiğinden, System.Management.Automation.Cmdlet.ProcessRecord yöntemini geçersiz kılar ve System.Management.Automation.Cmdlet.BeginProcessing ve System.Management.Automation.Cmdlet.EndProcessing için varsayılan uygulamaları kullanır. . System.Management.Automation.Cmdlet.ProcessRecord geçersiz kılma, işlemleri alır ve System.Management.Automation.Cmdlet.WriteObject yöntemini kullanarak bunları komut satırına yazar.

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

Giriş İşleme Hakkında Hatırlanması Gerekenler

  • Giriş için varsayılan kaynak, kullanıcı tarafından komut satırında sağlanan açık bir nesnedir (örneğin bir dize). Daha fazla bilgi için bkz. Komut Satırı Girişini İşlemek için Cmdlet Oluşturma.

  • Bir girdi işleme yöntemi aynı zamanda ardışık düzen üzerindeki bir yukarı akış cmdlet'inin çıktı nesnesinden de girdi alabilir. Daha fazla bilgi için bkz. İşlem Hattı Girişini İşlemek için Cmdlet Oluşturma. Cmdlet'inizin komut satırı ve ardışık düzen kaynaklarının birleşiminden girdi alabildiğini unutmayın.

  • Aşağı akış cmdlet'i uzun bir süre geri dönmeyebilir veya hiç dönmeyebilir. Bu nedenle, cmdlet'inizdeki giriş işleme yöntemi, System.Management.Automation.Cmdlet.WriteObject çağrıları sırasında, özellikle de kapsamı cmdlet örneğinin ötesine uzanan kilitlerde kilitleri tutmamalıdır.

Bu önemli

Cmdlet'ler asla System.Console.Writeline* veya eşdeğerini çağırmamalıdır.

  • Cmdlet'inizin işlenmesi tamamlandığında temizlenecek nesne değişkenleri olabilir (örneğin, System.Management.Automation.Cmdlet.BeginProcessing yönteminde bir dosya tanıtıcısı açarsa ve tanıtıcıyı System.Management.Automation tarafından kullanılmak üzere açık tutarsa). Cmdlet.ProcessRecord). Windows PowerShell çalışma zamanının her zaman nesne temizliği gerçekleştirmesi gereken System.Management.Automation.Cmdlet.EndProcessing yöntemini çağırmadığını unutmamak önemlidir.

Örneğin, cmdlet yarıda iptal edilirse veya cmdlet'in herhangi bir bölümünde bir sonlandırma hatası oluşursa System.Management.Automation.Cmdlet.EndProcessing çağrılamayabilir. Bu nedenle, nesne temizliği gerektiren bir cmdlet'in, sonlandırıcı da dahil olmak üzere System.IDisposable modelinin tamamını uygulaması gerekir; böylece çalışma zamanı, işlemin sonunda hem System.Management.Automation.Cmdlet.EndProcessing hem de System.IDisposable.Dispose* çağırabilir.

Kod Örneği

C# örnek kodunun tamamı için bkz. GetProcessSample01 Örneği.

Nesne Türlerini Tanımlama ve Biçimlendirme

Windows PowerShell, .NET nesnelerini kullanarak cmdlet'ler arasında bilgi aktarır. Sonuç olarak, bir cmdlet'in kendi türünü tanımlaması gerekebilir veya cmdlet'in başka bir cmdlet tarafından sağlanan mevcut bir türü genişletmesi gerekebilir. Yeni türleri tanımlama veya mevcut türleri genişletme hakkında daha fazla bilgi için bkz. Nesne Türlerini Genişletme ve Biçimlendirme.

Cmdlet'i oluşturma

Bir cmdlet'i uyguladıktan sonra bunu bir Windows PowerShell ek bileşeni aracılığıyla Windows PowerShell'e kaydetmeniz gerekir. Cmdlet'leri kaydetme hakkında daha fazla bilgi için bkz. Cmdlet'leri, Sağlayıcıları ve Ana Bilgisayar Uygulamalarını Kaydetme.

Cmdlet'i test etme

Cmdlet'iniz Windows PowerShell'e kaydedildiğinde komut satırında çalıştırarak test edebilirsiniz. Örnek Get-Proc cmdlet'imizin kodu küçüktür, ancak yine de Windows PowerShell çalışma zamanını ve mevcut bir .NET nesnesini kullanır; bu da onu kullanışlı kılmak için yeterlidir. Get-Proc'un neler yapabileceğini ve çıktısının nasıl kullanılabileceğini daha iyi anlamak için onu test edelim. Komut satırından cmdlet'leri kullanma hakkında daha fazla bilgi için Windows PowerShell'e Başlarken konusuna bakın.

  1. Windows PowerShell'i başlatın ve bilgisayarda çalışan mevcut işlemleri edinin.

    get-proc
    

    Aşağıdaki çıktı görünür.

    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. Daha kolay manipülasyon için cmdlet sonuçlarına bir değişken atayın.

    $p=get-proc
    
  3. İşlem sayısını alın.

    $p.length
    

    Aşağıdaki çıktı görünür.

    63
    
  4. Belirli bir işlemi alın.

    $p[6]
    

    Aşağıdaki çıktı görünür.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id    ProcessName
    -------  ------  -----  -----  -----  ------  --    -----------
    1033     3       2400   3336   35     0.53    1588  rundll32
    
  5. Bu işlemin başlangıç zamanını alın.

    $p[6].starttime
    

    Aşağıdaki çıktı görünür.

    Tuesday, July 26, 2005 9:34:15 AM
    
    $p[6].starttime.dayofyear
    
    207
    
  6. Tanıtıcı sayısı 500'den büyük olan işlemleri alın ve sonucu sıralayın.

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

    Aşağıdaki çıktı görünür.

    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. Her işlem için mevcut özellikleri listelemek için Get-Member cmdlet'ini kullanın.

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

    Aşağıdaki çıktı görünür.

    Name                     MemberType Definition
    ----                     ---------- ----------
    BasePriority             Property   System.Int32 BasePriority {get;}
    Container                Property   System.ComponentModel.IContainer Conta...
    EnableRaisingEvents      Property   System.Boolean EnableRaisingEvents {ge...
    ...
    

Ayrıca Bakınız

Komut Satırı Girişini İşlemek için Cmdlet Oluşturma

İşlem Hattı Girişini İşlemek için Cmdlet Oluşturma

Windows PowerShell Cmdlet'i Nasıl Oluşturulur

Nesne Türlerini ve Biçimlendirmeyi Genişletme

Windows PowerShell Nasıl Çalışır?

Cmdlet'leri, Sağlayıcıları ve Ana Bilgisayar Uygulamalarını Kaydetme

Windows PowerShell Referansı

Cmdlet Örnekleri

İlgili makaleler