Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu bölümde, parametreleri kullanmadan yerel bilgisayardan bilgi alan ve ardından bilgileri işlem hattına yazan bir cmdlet'in nasıl oluşturulacağı açıklanır. Burada açıklanan cmdlet, yerel bilgisayarın işlemleri hakkında bilgi alan ve ardından bu bilgileri komut satırında görüntüleyen bir Get-Proc cmdlet'idir.
Uyarı
Cmdlet'ler yazarken Windows PowerShell® başvuru derlemelerinin diske indirildiğini unutmayın (varsayılan olarak C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0 konumundadır). Bunlar Genel Derleme Önbelleği'ne (GAC) yüklenmez.
Cmdlet'i adlandırma
Cmdlet adı, cmdlet'in aldığı eylemi gösteren bir fiilden 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" adlı adı kullanır.
Cmdlet'leri adlandırırken şu karakterlerden hiçbirini kullanmayın: # , () {} [] & - /\ $ ; : " '<> | ? @ ` .
İsim Seçme
Belirli bir isim seçmelisiniz. Ürün adının kısaltılmış bir sürümüyle önekli tekil bir isim kullanmak en iyisidir. Bu türe örnek bir cmdlet adı"Get-SQLServer
" şeklindedir.
Fiil Seçme
Onaylanan 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'ini uygulamak için bir .NET sınıfı tanımlayın. Bu örnek Get-Proc cmdlet'i için sınıf tanımı aşağıda verilmiştir:
[Cmdlet(VerbsCommon.Get, "Proc")]
public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
Inherits Cmdlet
Sınıf tanımından önceki System.Management.Automation.CmdletAttribute özniteliğinin söz dizimi [Cmdlet(verb, noun, ...)]
olan bu sınıfı bir cmdlet olarak tanımlamak için kullanıldığına dikkat edin. Bu, tüm cmdlet'ler için gerekli olan tek özniteliktir ve Windows PowerShell çalışma zamanının bunları doğru şekilde çağırmasına izin verir. Gerekirse sınıfı daha fazla bildirmek için öznitelik anahtar sözcükleri ayarlayabilirsiniz. Örnek GetProcCommand sınıfımız için öznitelik bildiriminin, Get-Proc cmdlet'i için yalnızca isim ve fiil adlarını bildirdiğini unutmayın.
Uyarı
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, sınıf adındaki cmdlet adını yansıtmak iyi bir uygulamadır. Bunu yapmak için "VerbNounCommand" formunu kullanın ve "Fiil" ve "İsim" sözcüklerini cmdlet adında kullanılan fiil ve isim ile 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.
Önemli
Windows PowerShell çalışma zamanına doğrudan erişen bir cmdlet tanımlamak istiyorsanız, .NET sınıfınız System.Management.Automation.PSCmdlet temel sınıfından türetilmelidir. Bu sınıf hakkında daha fazla bilgi için bkz. Parametre Kümelerini Tanımlayan Bir Cmdlet Oluşturma.
Uyarı
Bir cmdlet sınıfı açıkça genel olarak işaretlenmelidir. Genel olarak işaretlenmemiş sınıflar varsayılan olarak iç olarak işaretlenir 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) yerleştirmeniz önerilir. Komut.
Giriş İşleme Yöntemini Geçersiz Kılma
System.Management.Automation.Cmdlet sınıfı, cmdlet'inizin geçersiz kıldığı üç ana giriş işleme yöntemi sağlar. 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 çağırır. Cmdlet'inizin bazı ön işleme veya kurulum gerçekleştirmesi gerekiyorsa, bu yöntemi geçersiz kılarak bunu yapabilir.
Uyarı
Windows PowerShell, bir cmdlet çağrıldığında sağlanan parametre değerleri kümesini açıklamak için "record" terimini kullanır.
Cmdlet'iniz işlem hattı girişini kabul ederse, 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 System.Management.Automation.Cmdlet.ProcessRecord kullanarak tüm girişleri toplar ve ardından Sort-Object
cmdlet'inin yaptığı gibi giriş üzerinde aynı anda bir öğe yerine bir bütün olarak çalışırsa her iki yöntemi de geçersiz kabilir.
Cmdlet'iniz işlem hattı girişi almazsa, System.Management.Automation.Cmdlet.EndProcessing yöntemini geçersiz kılmalıdır. Bu yöntemin, bir sıralama cmdlet'i için olduğu gibi cmdlet'i aynı anda bir öğe üzerinde çalışamadığında system.management.Automation.Cmdlet.BeginProcessing yerine sıklıkla kullanıldığını unutmayın.
Bu örnek Get-Proc cmdlet'i işlem hattı 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.EndProcessingiçin varsayılan uygulamaları kullanır. System.Management.Automation.Cmdlet.ProcessRecord geçersiz kılma işlemi 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 Anımsanacak Şeyler
Giriş için varsayılan kaynak, komut satırında kullanıcı tarafından sağlanan açık bir nesnedir (örneğin, bir dize). Daha fazla bilgi için bkz. komut satırı girişini işlemek için cmdlet oluşturma .
Giriş işleme yöntemi, işlem hattındaki bir yukarı akış cmdlet'inin çıkış nesnesinden de giriş alabilir. Daha fazla bilgi için bkz. İşlem Hattı Girişini İşlemek için Cmdlet Oluşturma. Cmdlet'inizin komut satırı ve işlem hattı kaynaklarının birleşiminden giriş alabildiğini unutmayın.
Aşağı akış cmdlet'i uzun süre geri dönemeyebilir veya hiç dönmeyebilir. Bu nedenle, cmdlet'inizdeki giriş işleme yöntemi, System.Management.Automation.Cmdlet.WriteObjectçağrıları sırasında kilitleri tutmamalıdır; özellikle kapsamın cmdlet örneğinin ötesine genişletildiği kilitler.
Önemli
Cmdlet'ler hiçbir zaman System.Console.Writeline* veya eşdeğerini çağırmamalıdır.
- cmdlet'inizin işlenmesi tamamlandığında temizlenmesi gereken 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.Cmdlet.ProcessRecord) tarafından kullanılmak üzere açık tutar. Windows PowerShell çalışma zamanının her zaman nesne temizleme gerçekleştirmesi gereken System.Management.Automation.Cmdlet.EndProcessing yöntemini çağırmadığını unutmayın.
Örneğin, cmdlet ortasında iptal edilirse veya cmdlet'in herhangi bir bölümünde sonlandırma hatası oluşursa System.Management.Automation.Cmdlet.EndProcessing çağrılamayabilir. Bu nedenle, nesne temizleme gerektiren bir cmdlet sonlandırıcı da dahil olmak üzere system.IDisposable deseninin tam uygulamalıdır, böylece çalışma zamanı işlem 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 Örnek .
Nesne Türlerini ve Biçimlendirmeyi Tanımlama
Windows PowerShell, .NET nesnelerini kullanarak cmdlet'ler arasında bilgi geçirir. Sonuç olarak, bir cmdlet'in kendi türünü tanımlaması veya cmdlet'in başka bir cmdlet tarafından sağlanan mevcut bir türü genişletmesi gerekebilir. Yeni türleri tanımlama veya var olan türleri genişletme hakkında daha fazla bilgi için bkz. Nesne Türlerini Genişletme ve Biçimlendirme.
Cmdlet'i oluşturma
Cmdlet'i uyguladıktan sonra, 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 Konak Uygulamalarını Kaydetme.
Cmdlet'i test etme
Cmdlet'iniz Windows PowerShell'e kaydedildiğinde, komut satırında çalıştırarak bunu 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 ve bu da onu yararlı hale getirmek için yeterlidir. Şimdi Get-Proc neler yapabileceğini ve çıkışın nasıl kullanılabileceğini daha iyi anlamak için test edelim. Komut satırından cmdlet'leri kullanma hakkında daha fazla bilgi için bkz. Windows PowerShell ile Çalışmaya Başlama .
Windows PowerShell'i başlatın ve bilgisayarda çalışan geçerli işlemleri alın.
Get-Proc
Aşağıdaki çıkış görüntülenir.
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 işleme için cmdlet sonuçlarına bir değişken atayın.
$p=Get-Proc
İşlem sayısını alın.
$p.Length
Aşağıdaki çıkış görüntülenir.
63
Belirli bir işlemi alma.
$p[6]
Aşağıdaki çıkış görüntülenir.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 1033 3 2400 3336 35 0.53 1588 rundll32
Bu işlemin başlangıç saatini alın.
$p[6].StartTime
Aşağıdaki çıkış görüntülenir.
Tuesday, July 26, 2005 9:34:15 AM
$p[6].StartTime.DayOfYear
207
Tanıtıcı sayısının 500'den büyük olduğu işlemleri alın ve sonucu sıralayın.
$p | Where-Object {$_.HandleCount -gt 500 } | Sort-Object HandleCount
Aşağıdaki çıkış görüntülenir.
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 kullanılabilir özellikleri listelemek için
Get-Member
cmdlet'ini kullanın.$p | Get-Member -MemberType Property
TypeName: System.Diagnostics.Process
Aşağıdaki çıkış görüntülenir.
Name MemberType Definition ---- ---------- ---------- BasePriority Property System.Int32 BasePriority {get;} Container Property System.ComponentModel.IContainer Conta... EnableRaisingEvents Property System.Boolean EnableRaisingEvents {ge... ...
Ayrıca Bkz.
komut satırı girişi işlemek için cmdlet oluşturma
İşlem Hattı Giriş İşlemek için Cmdlet Oluşturma
Windows PowerShell Cmdlet Oluşturma
Nesne Türlerini ve Biçimlendirme Genişletmeyi
Windows PowerShell'in Nasıl Çalıştığını
PowerShell