Conjuntos de cmdlets
Ao projetar seus cmdlets, você pode encontrar casos em que você precisa executar várias ações na mesma parte dos dados. Por exemplo, talvez seja necessário obter e definir dados ou iniciar e parar um processo. Embora seja necessário criar cmdlets separados para executar cada ação, o design do cmdlet deve incluir uma classe base da qual as classes para os cmdlets individuais são derivadas.
Lembre-se das seguintes coisas ao implementar uma classe base.
Declare os parâmetros comuns usados por todos os cmdlets derivados na classe base.
Adicione parâmetros específicos do cmdlet à classe de cmdlet apropriada.
Substitua o método de processamento de entrada apropriado na classe base.
Declare o atributo System.Management.Automation.CmdletAttribute em todas as classes de cmdlet, mas não declare-o na classe base.
Implemente uma classe System.Management.Automation.PSSnapIn ou System.Management.Automation.Custompssnapin cujo nome e descrição refletem o conjunto de cmdlets.
Exemplo
O exemplo a seguir mostra a implementação de uma classe base usada pelo cmdlet Get-Proc e Stop-Proc que derivam da mesma classe base.
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
}
Consulte Também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de