本部分介绍如何向 Stop-Proc
cmdlet 的参数添加别名、通配符扩展和帮助消息(如 创建修改系统的 Cmdlet 中所述)。
此 Stop-Proc
cmdlet 尝试停止使用 Get-Proc
cmdlet 检索的进程(如 创建第一个 Cmdlet中所述)。
定义 Cmdlet
cmdlet 创建的第一步始终命名 cmdlet 并声明实现 cmdlet 的 .NET 类。 由于你正在编写 cmdlet 来更改系统,因此应相应地对其进行命名。 由于此 cmdlet 停止系统进程,因此它使用由 System.Management.Automation.VerbsLifecycle 类定义的谓词 Stop,而名词 Proc 来指示进程。 有关批准的 cmdlet 谓词的详细信息,请参阅 Cmdlet 谓词名称。
以下代码是此 Stop-Proc
cmdlet 的类定义。
[Cmdlet(VerbsLifecycle.Stop, "proc",
SupportsShouldProcess = true)]
public class StopProcCommand : Cmdlet
定义用于系统修改的参数
cmdlet 需要定义支持系统修改和用户反馈的参数。 该 cmdlet 应定义 Name 参数或等效项,以便 cmdlet 能够通过某种标识符修改系统。 此外,cmdlet 还应定义 Force 和 PassThru 参数。 有关这些参数的详细信息,请参阅 创建修改系统的 Cmdlet。
定义参数别名
参数别名可以是备用名称,也可以是 cmdlet 参数的明确定义的 1 个字母或 2 个字母短名称。 在这两种情况下,使用别名的目标是简化命令行中的用户输入。 Windows PowerShell 通过 System.Management.Automation.AliasAttribute 属性(使用声明语法 [Alias()]
)支持参数别名。
以下代码演示如何将别名添加到 Name 参数。
/// <summary>
/// Specify the mandatory Name parameter used to identify the
/// processes to be stopped.
/// </summary>
[Parameter(
Position = 0,
Mandatory = true,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true,
HelpMessage = "The name of one or more processes to stop. Wildcards are permitted."
)]
[Alias("ProcessName")]
public string[] Name
{
get { return processNames; }
set { processNames = value; }
}
private string[] processNames;
除了使用 System.Management.Automation.AliasAttribute 属性之外,Windows PowerShell 运行时还会执行部分名称匹配,即使未指定别名也是如此。 例如,如果 cmdlet 具有 FileName 参数,并且它是以 F
开头的唯一参数,则用户可以输入 Filename
、Filenam
、File
、Fi
或 F
,并且仍将条目识别为 FileName 参数。
为参数创建帮助
Windows PowerShell 允许为 cmdlet 参数创建帮助。 对用于系统修改和用户反馈的任何参数执行此作。 对于支持帮助的每个参数,可以在 System.Management.Automation.ParameterAttribute 属性声明中设置 HelpMessage 属性关键字。 此关键字定义要向用户显示的文本,以获取使用参数的帮助。 还可以设置 HelpMessageBaseName 关键字来标识要用于消息的资源的基名称。 如果设置此关键字,还必须设置 HelpMessageResourceId 关键字来指定资源标识符。
此 Stop-Proc
cmdlet 中的以下代码定义 Name 参数的 HelpMessage 属性关键字。
/// <summary>
/// Specify the mandatory Name parameter used to identify the
/// processes to be stopped.
/// </summary>
[Parameter(
Position = 0,
Mandatory = true,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true,
HelpMessage = "The name of one or more processes to stop. Wildcards are permitted."
)]
重写输入处理方法
cmdlet 必须重写输入处理方法,通常 System.Management.Automation.Cmdlet.ProcessRecord。 修改系统时,cmdlet 应调用 System.Management.Automation.Cmdlet.ShouldProcess 和 System.Management.Automation.Cmdlet.ShouldContinue 方法,以允许用户在进行更改之前提供反馈。 有关这些方法的详细信息,请参阅 创建修改系统的 Cmdlet。
支持通配符扩展
若要允许选择多个对象,cmdlet 可以使用 System.Management.Automation.WildcardPattern 和 System.Management.Automation.WildcardOptions 类为参数输入提供通配符扩展支持。 通配符模式的示例包括 lsa*
、*.txt
和 [a-c]*
。 当模式包含应字面使用的字符时,请使用后引号字符(`
) 作为转义字符。
文件和路径名称的通配符扩展是常见方案的示例,其中 cmdlet 可能需要允许在选择多个对象时支持路径输入。 一种常见情况是在文件系统中,用户希望查看驻留在当前文件夹中的所有文件。
只需很少使用自定义通配符模式匹配实现。 在这种情况下,cmdlet 应支持完整的 POSIX 1003.2、3.13 规范通配符扩展或以下简化子集:
- 问号(
?
)。 匹配指定位置的任何字符。 - 星号(
*
)。 匹配从指定位置开始的零个或多个字符。 - 左括号(
[
)。 引入一个模式括号表达式,该表达式可以包含字符或一系列字符。 如果需要范围,则使用连字符(-
)来指示范围。 - 左括号(
]
)。 结束模式括号表达式。 - 后引号转义字符(
`
)。 指示应从字面上获取下一个字符。 请注意,从命令行(而不是以编程方式指定回引号字符)时,必须指定两次后引号转义字符。
注释
有关通配符模式的详细信息,请参阅 支持 Cmdlet 参数中的通配符。
以下代码演示如何设置通配符选项并定义用于解析此 cmdlet Name 参数的通配符模式。
WildcardOptions options = WildcardOptions.IgnoreCase |
WildcardOptions.Compiled;
WildcardPattern wildcard = new WildcardPattern(name,options);
以下代码演示如何测试进程名称是否与定义的通配符模式匹配。 请注意,在这种情况下,如果进程名称与模式不匹配,cmdlet 将继续获取下一个进程名称。
if (!wildcard.IsMatch(processName))
{
continue;
}
代码示例
有关完整的 C# 示例代码,请参阅 StopProcessSample03 示例。
定义对象类型和格式
Windows PowerShell 使用 .NET 对象在 cmdlet 之间传递信息。 因此,cmdlet 可能需要定义自己的类型,或者 cmdlet 可能需要扩展另一个 cmdlet 提供的现有类型。 有关定义新类型或扩展现有类型的详细信息,请参阅 扩展对象类型和格式。
生成 Cmdlet
实现 cmdlet 后,必须通过 Windows PowerShell 管理单元向 Windows PowerShell 注册它。 有关注册 cmdlet 的详细信息,请参阅 如何注册 Cmdlet、提供程序和主机应用程序。
测试 Cmdlet
将 cmdlet 注册到 Windows PowerShell 后,可以通过在命令行上运行它来测试它。 让我们测试示例 Stop-Proc cmdlet。 有关从命令行使用 cmdlet 的详细信息,请参阅 windows PowerShell 入门。
启动 Windows PowerShell 并使用
Stop-Proc
通过 Name 参数的 ProcessName 别名停止进程。PS> Stop-Proc -ProcessName notepad
将显示以下输出。
Confirm Are you sure you want to perform this action? Performing operation "Stop-Proc" on Target "notepad (3496)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): Y
在命令行上输入以下条目。 由于 Name 参数是必需的,因此系统会提示输入该参数。 输入
!?
会显示与参数关联的帮助文本。PS> Stop-Proc
将显示以下输出。
Cmdlet Stop-Proc at command pipeline position 1 Supply values for the following parameters: (Type !? for Help.) Name[0]: !? The name of one or more processes to stop. Wildcards are permitted. Name[0]: notepad
现在,进行以下条目以停止与通配符模式
*note*
匹配的所有进程。 在停止与模式匹配的每个进程之前,系统会提示你。PS> Stop-Proc -Name *note*
将显示以下输出。
Confirm Are you sure you want to perform this action? Performing operation "Stop-Proc" on Target "notepad (1112)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): Y
将显示以下输出。
Confirm Are you sure you want to perform this action? Performing operation "Stop-Proc" on Target "ONENOTEM (3712)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): N
将显示以下输出。
Confirm Are you sure you want to perform this action? Performing operation "Stop-Proc" on Target "ONENOTE (3592)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): N