Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Podczas projektowania poleceń cmdlet mogą wystąpić przypadki, w których trzeba wykonać kilka akcji na tym samym fragcie danych. Na przykład może być konieczne pobranie i ustawienie danych lub uruchomienie i zatrzymanie procesu. Mimo że należy utworzyć oddzielne polecenia cmdlet, aby wykonać każdą akcję, projekt polecenia cmdlet powinien zawierać klasę bazową, z której pochodzą klasy poszczególnych poleceń cmdlet.
Podczas implementowania klasy bazowej należy pamiętać o następujących kwestiach.
Zadeklaruj wszystkie typowe parametry używane przez wszystkie pochodne polecenia cmdlet w klasie bazowej.
Dodaj parametry specyficzne dla polecenia cmdlet do odpowiedniej klasy poleceń cmdlet.
Zastąpij odpowiednią metodę przetwarzania wejściowego w klasie bazowej.
Zadeklaruj atrybut System.Management.Automation.CmdletAttribute dla wszystkich klas poleceń cmdlet, ale nie deklaruj go w klasie bazowej.
Zaimplementuj System.Management.Automation.PSSnapIn lub System.Management.Automation.CustomPSSnapIn klasy, której nazwa i opis odzwierciedlają zestaw poleceń cmdlet.
Przykład
W poniższym przykładzie pokazano implementację klasy bazowej, która jest używana przez Get-Proc i Stop-Proc polecenia cmdlet pochodzącego z tej samej klasy bazowej.
using System;
using System.Diagnostics;
using System.Management.Automation; //Windows PowerShell namespace.
namespace Microsoft.Samples.PowerShell.Commands
{
#region ProcessCommands
/// <summary>
/// This class implements a Stop-Proc cmdlet. The parameters
/// for this cmdlet are defined by the BaseProcCommand class.
/// </summary>
[Cmdlet(VerbsLifecycle.Stop, "Proc", SupportsShouldProcess = true)]
public class StopProcCommand : BaseProcCommand
{
public override void ProcessObject(Process process)
{
if (ShouldProcess(process.ProcessName, "Stop-Proc"))
{
process.Kill();
}
}
}
/// <summary>
/// This class implements a Get-Proc cmdlet. The parameters
/// for this cmdlet are defined by the BaseProcCommand class.
/// </summary>
[Cmdlet(VerbsCommon.Get, "Proc")]
public class GetProcCommand : BaseProcCommand
{
public override void ProcessObject(Process process)
{
WriteObject(process);
}
}
/// <summary>
/// This class is the base class that defines the common
/// functionality used by the Get-Proc and Stop-Proc
/// cmdlets.
/// </summary>
public class BaseProcCommand : Cmdlet
{
#region Parameters
// Defines the Name parameter that is used to
// specify a process by its name.
[Parameter(
Position = 0,
Mandatory = true,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true
)]
public string[] Name
{
get { return processNames; }
set { processNames = value; }
}
private string[] processNames;
// Defines the Exclude parameter that is used to
// specify which processes should be excluded when
// the cmdlet performs its action.
[Parameter()]
public string[] Exclude
{
get { return excludeNames; }
set { excludeNames = value; }
}
private string[] excludeNames = new string[0];
#endregion Parameters
public virtual void ProcessObject(Process process)
{
throw new NotImplementedException("This method should be overridden.");
}
#region Cmdlet Overrides
// <summary>
// For each of the requested process names, retrieve and write
// the associated processes.
// </summary>
protected override void ProcessRecord()
{
// Set up the wildcard characters used in resolving
// the process names.
WildcardOptions options = WildcardOptions.IgnoreCase |
WildcardOptions.Compiled;
WildcardPattern[] include = new WildcardPattern[Name.Length];
for (int i = 0; i < Name.Length; i++)
{
include[i] = new WildcardPattern(Name[i], options);
}
WildcardPattern[] exclude = new WildcardPattern[Exclude.Length];
for (int i = 0; i < Exclude.Length; i++)
{
exclude[i] = new WildcardPattern(Exclude[i], options);
}
foreach (Process p in Process.GetProcesses())
{
foreach (WildcardPattern wIn in include)
{
if (wIn.IsMatch(p.ProcessName))
{
bool processThisOne = true;
foreach (WildcardPattern wOut in exclude)
{
if (wOut.IsMatch(p.ProcessName))
{
processThisOne = false;
break;
}
}
if (processThisOne)
{
ProcessObject(p);
}
break;
}
}
}
}
#endregion Cmdlet Overrides
}
#endregion ProcessCommands
}