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.
Bazen cmdlet'in yalnızca Windows PowerShell çalışma zamanının durumunu değil, sistemin çalışma durumunu değiştirmesi gerekir. Böyle durumlarda, cmdlet kullanıcının değişikliği yapıp yapmayacağını onaylamasına izin vermelidir.
Onayı 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 çağırın (aşağıdaki örnekte gösterildiği gibi).
Onay destekleyerek, cmdlet Windows PowerShell tarafından sağlanan Confirm ve WhatIf parametrelerini kullanıma sunar ve cmdlet'ler için geliştirme yönergelerini de karşılar (Cmdlet geliştirme yönergeleri hakkında daha fazla bilgi için bkz. Cmdlet Geliştirme Yönergeleri.).
Sistemi Değiştirme
"Sistemi değiştirme" eylemi, Windows PowerShell dışında sistemin durumunu değiştirme olasılığı olan herhangi bir cmdlet'i ifade eder. Örneğin, bir işlemi durdurma, kullanıcı hesabını etkinleştirme veya devre dışı bırakma veya veritabanı tablosuna satır ekleme, sistemde onaylanması gereken tüm değişikliklerdir.
Buna karşılık, verileri okuyan veya geçici bağlantılar kuran işlemler sistemi değiştirmez ve genellikle onay gerektirmez. Ayrıca, etkisi Windows PowerShell çalışma zamanı içinde sınırlı olan eylemler için de onay gerekmez, örneğin Set-Variable. Kalıcı bir değişiklik yapabilen veya yapabilen cmdlet'ler, yalnızca kalıcı bir değişiklik yapmak üzere olduklarında SupportsShouldProcess bildirmeli ve System.Management.Automation.Cmdlet.ShouldProcess çağırmalıdır.
Uyarı
ShouldProcess onayı yalnızca cmdlet'ler için geçerlidir. Komut veya betik doğrudan .NET yöntemlerini veya özelliklerini çağırarak veya Windows PowerShell dışındaki uygulamaları çağırarak sistemin çalışma durumunu değiştirirse, bu onay biçimi kullanılamaz.
StopProc Cmdlet'i
Bu konuda, Get-Proc cmdlet'i kullanılarak alınan işlemleri durdurmaya çalışan bir Stop-Proc cmdlet'i açıklanmaktadır (İlk Cmdlet'inizi Oluşturma).
Cmdlet'i tanımlama
Cmdlet oluşturmanın ilk adımı her zaman cmdlet'ini adlandırmak ve cmdlet'i uygulayan .NET sınıfını bildirmektir. Sistemi değiştirmek için bir cmdlet yazdığınızdan, buna uygun şekilde adlandırılmalıdır. Bu cmdlet sistem işlemlerini durdurur, bu nedenle burada seçilen fiil adı, System.Management.Automation.VerbsLifecycle sınıfı tarafından tanımlanan "Durdur", cmdlet'in işlemleri durdurduğunu belirtmek için "Proc" adıyla birlikte. Onaylanan cmdlet fiilleri hakkında daha fazla bilgi için bkz. Cmdlet Fiil Adları.
Bu Stop-Proc cmdlet'i için 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.Cmdlet.ShouldProcess ve System.Management.Automation.Cmdlet.ShouldContinueçağrısı yapmasını sağlamak için SupportsShouldProcess öznitelik anahtar sözcüğü true olarak ayarlandığını unutmayın.
Bu anahtar sözcük ayarlanmadan Confirm ve WhatIf parametreleri kullanıcı tarafından kullanılamaz.
Son Derece Yıkıcı Eylemler
Bazı işlemler, etkin bir sabit disk bölümünü yeniden biçimlendirme gibi son derece yıkıcıdır. Böyle durumlarda, System.Management.Automation.CmdletAttribute özniteliği bildirildiğinde cmdlet ConfirmImpact = ConfirmImpact.High ayarlamalıdır. Bu ayar, kullanıcı Confirm parametresini belirtmemiş olsa bile cmdlet'i kullanıcı onayı istemeye zorlar. Ancak cmdlet geliştiricileri, kullanıcı hesabını silme gibi yıkıcı olabilecek işlemler için ConfirmImpact fazla kullanmaktan kaçınmalıdır.
ConfirmImpact
System.Management.Automation.ConfirmImpactHigholarak ayarlanırsa unutmayın.
Benzer şekilde, bazı işlemlerin yıkıcı olma olasılığı düşüktür, ancak bunlar teoride Windows PowerShell dışındaki bir sistemin çalışma durumunu değiştirir. Bu tür cmdlet'ler ConfirmImpactSystem.Management.Automation.ConfirmImpact.Lowolarak ayarlayabilir.
Bu, kullanıcının yalnızca orta düzeyde etkili ve yüksek etkili işlemleri onaylamasını istediği onay isteklerini atlar.
Sistem Değişikliği için Parametreleri Tanımlama
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. Parametreleri tanımlama hakkında genel bilgilere ihtiyacınız varsa bkz. CommandLine Girişini İşleyen Parametreler Ekleme.
Stop-Proc cmdlet'i üç parametre tanımlar: Name, Forceve PassThru.
Name parametresi, işlem giriş nesnesinin Name özelliğine karşılık gelir. Bu örnekteki Name parametresinin zorunlu olduğunu unutmayın; cmdlet 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 çağıran tüm cmdlet'ler Force parametresine sahip olmalıdır, böylece Force belirtildiğinde cmdlet System.Management.Automation.Cmdlet.ShouldContinue çağrısını atlar ve işlemle devam eder. Bunun System.Management.Automation.Cmdlet.ShouldProcessçağrılarını etkilemediğini unutmayın.
PassThru parametresi, kullanıcının bir işlem durdurulduktan sonra cmdlet'in işlem hattı üzerinden bir çıkış nesnesi geçirip geçirmediğini belirtmesine olanak tanır. Bu parametrenin giriş nesnesinin bir özelliği yerine cmdlet'in kendisine bağlı olduğunu unutmayın.
Stop-Proc cmdlet'i için parametre bildirimi aşağıdadı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 bir giriş işleme yöntemini geçersiz kılmalıdır. Aşağıdaki kod, örnek Stop-Proc cmdlet'inde kullanılan System.Management.Automation.Cmdlet.ProcessRecord geçersiz kılmasını gösterir. İstenen her işlem adı için bu yöntem, işlemin özel bir işlem olmamasını sağlar, işlemi durdurmaya çalışır ve PassThru parametresi belirtilirse bir çıkış 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öntemini Çağırma
Cmdlet'inizin giriş işleme yöntemi, sistemin çalışma durumunda bir değişiklik (örneğin, dosyaları silme) yapılmadan ö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.
Uyarı
Bir cmdlet desteklediğini belirtirse, system.Management.Automation.Cmdlet.ShouldProcess çağrısı işlemesi gerekir ve başarısız olursa, 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 nelerin görüntüleneceğini belirlerken komut satırı ayarlarını veya tercih değişkenlerini dikkate alır.
Aşağıdaki örnekte, ö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ı gösterilmektedir.
if (!ShouldProcess(string.Format("{0} ({1})", processName,
process.Id)))
{
continue;
}
ShouldContinue Yöntemini Çağırma
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ından sonra true döndürür ve Force parametresi trueolarak ayarlanmadıysa yapılır. Kullanıcı daha sonra işlemin devam edip edilmeyeceğini söylemek için geri bildirim sağlayabilir. Cmdlet'iniz System.Management.Automation.Cmdlet.ShouldContinue'i tehlikeli olabilecek sistem değişiklikleri için ek bir denetim olarak veya kullanıcıya evet ve no-toseçenekleri sağlamak istediğinizde çağırır.
Aşağıdaki örnekte, ö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ı gösterilmektedir.
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 giriş işleme yöntemi, girişin işlenmesini durdurmanın bir yolunu sağlamalıdır. Bu Stop-Proc cmdlet'i söz konusu olduğunda, System.Management.Automation.Cmdlet.ProcessRecord yönteminden System.Diagnostics.Process.Kill* yöntemine bir çağrı yapılır.
PassThru parametresi trueolarak ayarlandığından, System.Management.Automation.Cmdlet.ProcessRecord işlem nesnesini işlem hattına göndermek için System.Management.Automation.Cmdlet.WriteObject de çağırır.
Kod Örneği
C# örnek kodunun tamamı için bkz. StopProcessSample01 Sample.
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
Bir cmdlet uygulandıktan sonra, bir 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 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. Stop-Proc cmdlet'ini test eden birkaç test aşağıdadır. 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 aşağıda gösterildiği gibi işlemeyi durdurmak için Stop-Proc cmdlet'ini kullanın. cmdlet
Nameparametresini zorunlu olarak belirttiğinden, cmdlet parametresini sorgular.PS> Stop-ProcAşağıdaki çıkış görüntülenir.
Cmdlet Stop-Proc at command pipeline position 1 Supply values for the following parameters: Name[0]:Şimdi "NOT DEFTERI" adlı işlemi durdurmak için cmdlet'ini kullanalım. Cmdlet eylemi onaylamanızı ister.
PS> Stop-Proc -Name notepadAşağıdaki çıkış görüntülenir.
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 gösterildiği gibi Stop-Proc 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 çıkış görüntülenir.
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 uyarı almadan WINLOGON işlemini durdurmayı deneyelim. Bu komut girdisinin uyarıyı geçersiz kılmak için
Forceparametresini kullandığını unutmayın.PS> Stop-Proc -Name winlogon -ForceAşağıdaki çıkış görüntülenir.
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 Bkz.
Giriş İşleyen Parametreler Command-Line Ekleme
Nesne Türlerini ve Biçimlendirme Genişletmeyi
Cmdlet'leri, Sağlayıcıları ve Konak Uygulamalarını Kaydetme
Windows PowerShell SDK
PowerShell