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.
Windows PowerShell'i başlatın ve bilgisayarda çalışan mevcut işlemleri edinin.
get-procAş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 ...Daha kolay manipülasyon için cmdlet sonuçlarına bir değişken atayın.
$p=get-procİşlem sayısını alın.
$p.lengthAşağıdaki çıktı görünür.
63Belirli 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 rundll32Bu işlemin başlangıç zamanını alın.
$p[6].starttimeAşağıdaki çıktı görünür.
Tuesday, July 26, 2005 9:34:15 AM$p[6].starttime.dayofyear207Tanı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 HandleCountAş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 ...Her işlem için mevcut özellikleri listelemek için
Get-Membercmdlet'ini kullanın.$p | Get-Member -MemberType propertyTypeName: System.Diagnostics.ProcessAş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