Sistemi Değiştiren Bir Cmdlet Oluşturma
Bazen bir cmdlet'in yalnızca Windows PowerShell çalışma zamanının durumunu değil, sistemin çalışma durumunu da değiştirmesi gerekir. Bu durumlarda cmdlet, kullanıcıya değişikliği yapıp yapmayacağını onaylama şansı vermelidir.
Onaylamayı desteklemek için bir cmdlet'in iki şey yapması gerekir.
SupportsShouldProcess anahtar sözcüğünü
trueolarak ayarlayarak System.Management.Automation.CmdletAttribute özniteliğini belirttiğinizde cmdlet'in onayı desteklediğini bildirin.Cmdlet'in yürütülmesi sırasında System.Management.Automation.Cmdlet.ShouldProcess'i çağırın (aşağıdaki örnekte gösterildiği gibi).
Bir cmdlet, onayı destekleyerek Windows PowerShell tarafından sağlanan Confirm ve WhatIf parametrelerini ortaya çıkarır ve aynı zamanda cmdlet'lere yönelik geliştirme yönergelerini de karşılar (Cmdlet geliştirme yönergeleri hakkında daha fazla bilgi için, bkz. bkz. Cmdlet Geliştirme Yönergeleri.).
Sistemi Değiştirmek
"Sistemi değiştirme" eylemi, Windows PowerShell dışında sistemin durumunu potansiyel olarak değiştiren herhangi bir cmdlet'i ifade eder. Örneğin, bir işlemin durdurulması, bir kullanıcı hesabının etkinleştirilmesi veya devre dışı bırakılması ya da bir veritabanı tablosuna satır eklenmesi, sistemde onaylanması gereken değişikliklerdir. Bunun aksine, veri okuyan veya geçici bağlantılar kuran işlemler sistemi değiştirmez ve genellikle onay gerektirmez. Etkisi Windows PowerShell çalışma zamanı içinde sınırlı olan set-variable gibi eylemler için de onaya gerek yoktur. Kalıcı bir değişiklik yapabilecek veya yapmayabilecek cmdlet'ler SupportsShouldProcess bildirmeli ve System.Management.Automation.Cmdlet.ShouldProcess'i yalnızca kalıcı bir değişiklik yapmak üzereyse çağırmalıdır.
Not
ShouldProcess onayı yalnızca cmdlet'ler için geçerlidir. Bir komut veya komut dosyası, doğrudan .NET yöntemlerini veya özelliklerini çağırarak veya Windows PowerShell dışındaki uygulamaları çağırarak bir sistemin çalışma durumunu değiştirirse, bu onay formu kullanılamayacaktır.
StopProc Cmdlet'i
Bu konu, Get-Proc cmdlet'i (İlk Cmdlet'inizi Oluşturma bölümünde açıklanmıştır) kullanılarak alınan işlemleri durdurmaya çalışan bir Stop-Proc cmdlet'ini açıklamaktadır.
Cmdlet'i tanımlama
Cmdlet oluşturmanın ilk adımı her zaman cmdlet'i adlandırmak ve cmdlet'i uygulayan .NET sınıfını bildirmektir. Sistemi değiştirmek için bir cmdlet yazdığınız için buna göre adlandırılması gerekir. Bu cmdlet sistem işlemlerini durdurur, dolayısıyla burada seçilen fiil adı System.Management.Automation.Verbslifecycle sınıfı tarafından tanımlanan "Stop" olup, cmdlet'in işlemleri durdurduğunu belirtmek için "Proc" adı kullanılır. Onaylanan cmdlet fiilleri hakkında daha fazla bilgi için bkz. Cmdlet Fiil Adları.
Bu Stop-Proc cmdlet'inin sınıf tanımı aşağıdadır.
[Cmdlet(VerbsLifecycle.Stop, "Proc",
SupportsShouldProcess = true)]
public class StopProcCommand : Cmdlet
System.Management.Automation.CmdletAttribute bildiriminde, cmdlet'in System.Management.Automation'a çağrı yapmasına olanak sağlamak için SupportsShouldProcess öznitelik anahtar sözcüğünün true olarak ayarlandığını unutmayın. Cmdlet.ShouldProcess ve System.Management.Automation.Cmdlet.ShouldContinue. Bu anahtar kelime ayarlanmadan, Onayla ve WhatIf parametreleri kullanıcı tarafından kullanılamaz.
Son Derece Yıkıcı Eylemler
Aktif bir sabit disk bölümünün yeniden biçimlendirilmesi gibi bazı işlemler son derece yıkıcıdır. Bu durumlarda, System.Management.Automation.CmdletAttribute özniteliğini bildirirken cmdlet'in ConfirmImpact=ConfirmImpact.High olarak ayarlanması gerekir. Bu ayar, kullanıcı Confirm parametresini belirtmemiş olsa bile cmdlet'i kullanıcı onayı istemeye zorlar. Ancak cmdlet geliştiricileri, kullanıcı hesabını silmek gibi potansiyel olarak yıkıcı işlemler için ConfirmImpact'ı aşırı kullanmaktan kaçınmalıdır. ConfirmImpact'ın System.Management.Automation.ConfirmImpact Yüksek olarak ayarlanması durumunda bunu unutmayın.
Benzer şekilde, teorik olarak Windows PowerShell dışındaki bir sistemin çalışma durumunu değiştirseler de bazı işlemlerin yıkıcı olma olasılığı düşüktür. Bu tür cmdlet'ler ConfirmImpact'ı System.Management.Automation.Confirmimpact.Low olarak ayarlayabilir. Bu, kullanıcının yalnızca orta etkili ve yüksek etkili işlemleri onaylamayı istediği durumlarda onay isteklerini atlayacaktır.
Sistem Değişikliği İçin Parametrelerin Tanımlanması
Bu bölümde, sistem değişikliğini desteklemek için gerekenler de dahil olmak üzere cmdlet parametrelerinin nasıl tanımlanacağı açıklanmaktadır. Parametrelerin tanımlanması hakkında genel bilgiye ihtiyacınız varsa Komut Satırı Girişini İşleyen Parametreler Ekleme konusuna bakın.
Stop-Proc cmdlet'i üç parametre tanımlar: Ad, Force ve PassThru.
Ad parametresi, işlem giriş nesnesinin Ad özelliğine karşılık gelir. Bu örnekteki Ad parametresinin zorunlu olduğunu unutmayın; çünkü cmdlet'in durdurulacak adlandırılmış bir işlemi yoksa başarısız olur.
Force parametresi, kullanıcının System.Management.Automation.Cmdlet.ShouldContinue çağrılarını geçersiz kılmasına olanak tanır. Aslında, System.Management.Automation.Cmdlet.ShouldContinue öğesini çağıran herhangi bir cmdlet'in bir Force parametresine sahip olması gerekir; böylece Force belirtildiğinde cmdlet, System.Cmdlet çağrısını atlar. Management.Automation.Cmdlet.ShouldContinue ve işleme devam eder. Bunun System.Management.Automation.Cmdlet.ShouldProcess'e yapılan çağrıları etkilemediğini unutmayın.
PassThru parametresi, kullanıcının, cmdlet'in bir çıkış nesnesini işlem hattından geçirip geçirmediğini (bu durumda, bir işlem durdurulduktan sonra) belirtmesine olanak tanır. Bu parametrenin giriş nesnesinin bir özelliği yerine cmdlet'in kendisine bağlı olduğunu unutmayın.
Stop-Proc cmdlet'inin parametre bildirimi buradadır.
[Parameter(
Position = 0,
Mandatory = true,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true
)]
public string[] Name
{
get { return processNames; }
set { processNames = value; }
}
private string[] processNames;
/// <summary>
/// Specify the Force parameter that allows the user to override
/// the ShouldContinue call to force the stop operation. This
/// parameter should always be used with caution.
/// </summary>
[Parameter]
public SwitchParameter Force
{
get { return force; }
set { force = value; }
}
private bool force;
/// <summary>
/// Specify the PassThru parameter that allows the user to specify
/// that the cmdlet should pass the process object down the pipeline
/// after the process has been stopped.
/// </summary>
[Parameter]
public SwitchParameter PassThru
{
get { return passThru; }
set { passThru = value; }
}
private bool passThru;
Giriş İşleme Yöntemini Geçersiz Kılma
Cmdlet'in bir giriş işleme yöntemini geçersiz kılması gerekir. Aşağıdaki kod, örnek Stop-Proc cmdlet'inde kullanılan System.Management.Automation.Cmdlet.ProcessRecord geçersiz kılmayı göstermektedir. Bu yöntem, istenen her işlem adı için, işlemin özel bir işlem olmamasını sağlar, işlemi durdurmaya çalışır ve ardından PassThru parametresi belirtildiyse bir çıktı nesnesi gönderir.
protected override void ProcessRecord()
{
foreach (string name in processNames)
{
// For every process name passed to the cmdlet, get the associated
// process(es). For failures, write a non-terminating error
Process[] processes;
try
{
processes = Process.GetProcessesByName(name);
}
catch (InvalidOperationException ioe)
{
WriteError(new ErrorRecord(ioe,"Unable to access the target process by name",
ErrorCategory.InvalidOperation, name));
continue;
}
// Try to stop the process(es) that have been retrieved for a name
foreach (Process process in processes)
{
string processName;
try
{
processName = process.ProcessName;
}
catch (Win32Exception e)
{
WriteError(new ErrorRecord(e, "ProcessNameNotFound",
ErrorCategory.ReadError, process));
continue;
}
// Call Should Process to confirm the operation first.
// This is always false if WhatIf is set.
if (!ShouldProcess(string.Format("{0} ({1})", processName,
process.Id)))
{
continue;
}
// Call ShouldContinue to make sure the user really does want
// to stop a critical process that could possibly stop the computer.
bool criticalProcess =
criticalProcessNames.Contains(processName.ToLower());
if (criticalProcess &&!force)
{
string message = String.Format
("The process \"{0}\" is a critical process and should not be stopped. Are you sure you wish to stop the process?",
processName);
// It is possible that ProcessRecord is called multiple times
// when the Name parameter receives objects as input from the
// pipeline. So to retain YesToAll and NoToAll input that the
// user may enter across multiple calls to ProcessRecord, this
// information is stored as private members of the cmdlet.
if (!ShouldContinue(message, "Warning!",
ref yesToAll,
ref noToAll))
{
continue;
}
} // if (criticalProcess...
// Stop the named process.
try
{
process.Kill();
}
catch (Exception e)
{
if ((e is Win32Exception) || (e is SystemException) ||
(e is InvalidOperationException))
{
// This process could not be stopped so write
// a non-terminating error.
string message = String.Format("{0} {1} {2}",
"Could not stop process \"", processName,
"\".");
WriteError(new ErrorRecord(e, message,
ErrorCategory.CloseError, process));
continue;
} // if ((e is...
else throw;
} // catch
// If the PassThru parameter argument is
// True, pass the terminated process on.
if (passThru)
{
WriteObject(process);
}
} // foreach (Process...
} // foreach (string...
} // ProcessRecord
ShouldProcess Yönteminin Çağrılması
Cmdlet'inizin giriş işleme yöntemi, sistemin çalışma durumunda bir değişiklik yapılmadan (örneğin, dosyaları silmek) önce bir işlemin yürütülmesini onaylamak için System.Management.Automation.Cmdlet.ShouldProcess yöntemini çağırmalıdır. Bu, Windows PowerShell çalışma zamanının kabuk içinde doğru "WhatIf" ve "Confirm" davranışını sağlamasına olanak tanır.
Not
Bir cmdlet, işlemeyi desteklediğini belirtiyorsa ve System.Management.Automation.Cmdlet.ShouldProcess çağrısını yapamıyorsa, kullanıcı sistemi beklenmedik bir şekilde değiştirebilir.
System.Management.Automation.Cmdlet.ShouldProcess çağrısı, değiştirilecek kaynağın adını kullanıcıya gönderir; Windows PowerShell çalışma zamanı, kullanıcıya neyin gösterilmesi gerektiğini belirlerken tüm komut satırı ayarlarını veya tercih değişkenlerini dikkate alır. .
Aşağıdaki örnek, örnek Stop-Proc cmdlet'indeki System.Management.Automation.Cmdlet.ProcessRecord yönteminin geçersiz kılınmasından System.Management.Automation.Cmdlet.ShouldProcess çağrısını gösterir.
if (!ShouldProcess(string.Format("{0} ({1})", processName,
process.Id)))
{
continue;
}
ShouldContinue Yöntemini Çağırmak
System.Management.Automation.Cmdlet.ShouldContinue yöntemine yapılan çağrı, kullanıcıya ikincil bir ileti gönderir. Bu çağrı, System.Management.Automation.Cmdlet.ShouldProcess çağrısının true döndürmesinden sonra ve Force parametresi true olarak ayarlanmamışsa yapılır. . Kullanıcı daha sonra işlemin devam ettirilip ettirilmeyeceğine dair geri bildirimde bulunabilir. Cmdlet'iniz System.Management.Automation.Cmdlet.ShouldContinue öğesini potansiyel olarak tehlikeli sistem değişikliklerine yönelik ek bir kontrol olarak veya kullanıcıya hepsine evet ve hepsine hayır seçenekleri sunmak istediğinizde çağırır.
Aşağıdaki örnek, örnek Stop-Proc cmdlet'indeki System.Management.Automation.Cmdlet.ProcessRecord yönteminin geçersiz kılınmasından System.Management.Automation.Cmdlet.ShouldContinue çağrısını gösterir.
if (criticalProcess &&!force)
{
string message = String.Format
("The process \"{0}\" is a critical process and should not be stopped. Are you sure you wish to stop the process?",
processName);
// It is possible that ProcessRecord is called multiple times
// when the Name parameter receives objects as input from the
// pipeline. So to retain YesToAll and NoToAll input that the
// user may enter across multiple calls to ProcessRecord, this
// information is stored as private members of the cmdlet.
if (!ShouldContinue(message, "Warning!",
ref yesToAll,
ref noToAll))
{
continue;
}
} // if (criticalProcess...
Giriş İşlemeyi Durdurma
Sistem değişiklikleri yapan bir cmdlet'in girdi işleme yöntemi, girdinin işlenmesini durdurmanın bir yolunu sağlamalıdır. Bu Stop-Proc cmdlet'i durumunda, System.Management.Automation.Cmdlet.ProcessRecord yönteminden System.Diagnostics.Process.Kill* yöntemine bir çağrı yapılır. PassThru parametresi true olarak ayarlandığından, System.Management.Automation.Cmdlet.ProcessRecord, işlem nesnesini boru hattı.
Kod Örneği
C# örnek kodunun tamamı için bkz. StopProcessSample01 Ö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 Windows PowerShell ek bileşeni aracılığıyla Windows PowerShell'e kaydedilmesi 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. Burada Stop-Proc cmdlet'ini test eden çeşitli testler verilmiştir. 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 aşağıda gösterildiği gibi işlemeyi durdurmak için Stop-Proc cmdlet'ini kullanın. Cmdlet
Adparametresini zorunlu olarak belirttiğinden, cmdlet parametreyi sorgular.PS> stop-procAşağıdaki çıktı görünür.
Cmdlet stop-proc at command pipeline position 1 Supply values for the following parameters: Name[0]:Şimdi "NOTEPAD" isimli işlemi durdurmak için cmdlet'i kullanalım. Cmdlet sizden eylemi onaylamanızı ister.
PS> stop-proc -Name notepadAşağıdaki çıktı görünür.
Confirm Are you sure you want to perform this action? Performing operation "stop-proc" on Target "notepad (4996)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): Y"WINLOGON" adlı kritik işlemi durdurmak için Stop-Proc'u gösterildiği gibi kullanın. İşletim sisteminin yeniden başlatılmasına neden olacağı için bu eylemi gerçekleştirmeniz istenir ve uyarılırsınız.
PS> stop-proc -Name WinlogonAşağıdaki çıktı görünür.
Confirm Are you sure you want to perform this action? Performing operation "stop-proc" on Target "winlogon (656)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): Y Warning! The process " winlogon " is a critical process and should not be stopped. Are you sure you wish to stop the process? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): NŞimdi WINLOGON işlemini uyarı almadan durdurmaya çalışalım. Bu komut girişinin, uyarıyı geçersiz kılmak için
Forceparametresini kullandığını unutmayın.PS> stop-proc -Name winlogon -ForceAşağıdaki çıktı görünür.
Confirm Are you sure you want to perform this action? Performing operation "stop-proc" on Target "winlogon (656)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): N
Ayrıca Bakınız
Komut Satırı Girişini İşleyen Parametreler Ekleme
Nesne Türlerini ve Biçimlendirmeyi Genişletme
Cmdlet'leri, Sağlayıcıları ve Ana Bilgisayar Uygulamalarını Kaydetme
Windows PowerShell SDK'sı
Cmdlet Örnekleri