Cmdlet 集
设计 cmdlet 时,可能会遇到需要对同一数据片段执行多项作的情况。 例如,可能需要获取和设置数据或启动和停止进程。 尽管需要创建单独的 cmdlet 来执行每个作,但 cmdlet 设计应包含从中派生各个 cmdlet 的类的基类。
实现基类时,请记住以下事项。
声明基类中所有派生 cmdlet 使用的任何通用参数。
将特定于 cmdlet 的参数添加到相应的 cmdlet 类。
重写基类中的相应输入处理方法。
在所有 cmdlet 类上声明 System.Management.Automation.CmdletAttribute 属性,但不在基类上声明它。
实现 System.Management.Automation.PSSnapIn 或 System.Management.Automation.CustomPSSnapIn 类,其名称和说明反映 cmdlet 集。
示例
以下示例演示 Get-Proc 和派生自同一基类的 Stop-Proc cmdlet 使用的基类的实现。
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
}