有关参数集的注意事项
Windows PowerShell 将参数集定义为一组共同作的参数。 通过对 cmdlet 的参数进行分组,可以创建一个 cmdlet,该 cmdlet 可以根据用户指定的参数组更改其功能。
使用两个参数集定义不同功能的 cmdlet 的一个示例是 Windows PowerShell 提供的 Get-EventLog
cmdlet。 当用户指定 List
或 LogName
参数时,此 cmdlet 将返回不同的信息。 如果指定了 LogName
参数,则 cmdlet 将返回有关给定事件日志中的事件的信息。 如果指定了 List
参数,cmdlet 将返回有关日志文件本身的信息(而不是它们包含的事件信息)。 在这种情况下,List
和 LogName
参数标识两个单独的参数集。
需要记住关于参数集的两个重要事项是,Windows PowerShell 运行时只对特定输入使用一个参数集,并且每个参数集必须至少有一个参数,该参数集对于该参数集是唯一的。
为了说明最后一点,此 Stop-Proc cmdlet 使用三个参数集:ProcessName
、ProcessId
和 InputObject
。 其中每个参数集都有一个不在其他参数集中的参数。 参数集可以共享其他参数,但 cmdlet 使用唯一参数 ProcessName
、ProcessId
和 InputObject
来标识 Windows PowerShell 运行时应使用的参数集。
声明 Cmdlet 类
cmdlet 创建的第一步始终命名 cmdlet 并声明实现 cmdlet 的 .NET 类。 对于此 cmdlet,使用生命周期谓词“Stop”,因为 cmdlet 会停止系统进程。 使用名词名“Proc”,因为 cmdlet 适用于进程。 在下面的声明中,请注意,cmdlet 谓词和名词名称反映在 cmdlet 类的名称中。
注释
有关批准的 cmdlet 谓词名称的详细信息,请参阅 Cmdlet 谓词名称。
以下代码是此 Stop-Proc cmdlet 的类定义。
[Cmdlet(VerbsLifecycle.Stop, "Proc",
DefaultParameterSetName = "ProcessId",
SupportsShouldProcess = true)]
public class StopProcCommand : PSCmdlet
<Cmdlet(VerbsLifecycle.Stop, "Proc", DefaultParameterSetName:="ProcessId", _
SupportsShouldProcess:=True)> _
Public Class StopProcCommand
Inherits PSCmdlet
声明 Cmdlet 的参数
此 cmdlet 定义作为 cmdlet 输入所需的三个参数(这些参数还定义参数集),以及用于管理 cmdlet 执行的作的 Force
参数,以及一个 PassThru
参数,用于确定 cmdlet 是否通过管道发送输出对象。 默认情况下,此 cmdlet 不会通过管道传递对象。 有关这两个参数的详细信息,请参阅 创建修改系统的 Cmdlet。
声明 Name 参数
此输入参数允许用户指定要停止的进程的名称。 请注意,System.Management.Automation.ParameterAttribute 属性的 ParameterSetName
属性关键字指定此参数 ProcessName
参数集。
[Parameter(
Position = 0,
ParameterSetName = "ProcessName",
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;
<Parameter(Position:=0, ParameterSetName:="ProcessName", _
Mandatory:=True, _
ValueFromPipeline:=True, ValueFromPipelineByPropertyName:=True, _
HelpMessage:="The name of one or more processes to stop. " & _
"Wildcards are permitted."), [Alias]("ProcessName")> _
Public Property Name() As String()
Get
Return processNames
End Get
Set(ByVal value As String())
processNames = value
End Set
End Property
Private processNames() As String
另请注意,为此参数提供了别名“ProcessName”。
声明 ID 参数
此输入参数允许用户指定要停止的进程标识符。 请注意,System.Management.Automation.ParameterAttribute 属性的 ParameterSetName
属性关键字指定 ProcessId
参数集。
[Parameter(
ParameterSetName = "ProcessId",
Mandatory = true,
ValueFromPipelineByPropertyName = true,
ValueFromPipeline = true
)]
[Alias("ProcessId")]
public int[] Id
{
get { return processIds; }
set { processIds = value; }
}
private int[] processIds;
<Parameter(ParameterSetName:="ProcessId", _
Mandatory:=True, _
ValueFromPipelineByPropertyName:=True, _
ValueFromPipeline:=True), [Alias]("ProcessId")> _
Public Property Id() As Integer()
Get
Return processIds
End Get
Set(ByVal value As Integer())
processIds = value
End Set
End Property
Private processIds() As Integer
另请注意,为此参数提供了别名“ProcessId”。
声明 InputObject 参数
此输入参数允许用户指定包含要停止的进程信息的输入对象。 请注意,System.Management.Automation.ParameterAttribute 属性的 ParameterSetName
属性关键字指定此参数 InputObject
参数集。
[Parameter(
ParameterSetName = "InputObject",
Mandatory = true,
ValueFromPipeline = true)]
public Process[] InputObject
{
get { return inputObject; }
set { inputObject = value; }
}
private Process[] inputObject;
<Parameter(ParameterSetName:="InputObject", _
Mandatory:=True, ValueFromPipeline:=True)> _
Public Property InputObject() As Process()
Get
Return myInputObject
End Get
Set(ByVal value As Process())
myInputObject = value
End Set
End Property
Private myInputObject() As Process
另请注意,此参数没有别名。
声明多个参数集中的参数
尽管每个参数集必须具有唯一参数,但参数可以属于多个参数集。 在这些情况下,为共享参数提供 System.Management.Automation.ParameterAttribute 参数所属的每个集的属性声明。 如果参数位于所有参数集中,则只需声明一次参数属性,并且不需要指定参数集名称。
重写输入处理方法
每个 cmdlet 都必须重写输入处理方法,这通常是 System.Management.Automation.Cmdlet.ProcessRecord 方法。 在此 cmdlet 中,将重写 System.Management.Automation.Cmdlet.ProcessRecord 方法,以便 cmdlet 可以处理任意数量的进程。 它包含一个 Select 语句,该语句基于用户指定的参数集调用其他方法。
protected override void ProcessRecord()
{
switch (ParameterSetName)
{
case "ProcessName":
ProcessByName();
break;
case "ProcessId":
ProcessById();
break;
case "InputObject":
foreach (Process process in inputObject)
{
SafeStopProcess(process);
}
break;
default:
throw new ArgumentException("Bad ParameterSet Name");
} // switch (ParameterSetName...
} // ProcessRecord
Protected Overrides Sub ProcessRecord()
Select Case ParameterSetName
Case "ProcessName"
ProcessByName()
Case "ProcessId"
ProcessById()
Case "InputObject"
Dim process As Process
For Each process In myInputObject
SafeStopProcess(process)
Next process
Case Else
Throw New ArgumentException("Bad ParameterSet Name")
End Select
End Sub 'ProcessRecord ' ProcessRecord
此处未介绍 Select 语句调用的帮助程序方法,但你可以在下一部分的完整代码示例中看到其实现。
代码示例
有关完整的 C# 示例代码,请参阅 StopProcessSample04 示例。
定义对象类型和格式
Windows PowerShell 使用 .NET 对象在 cmdlet 之间传递信息。 因此,cmdlet 可能需要定义自己的类型,或者 cmdlet 可能需要扩展另一个 cmdlet 提供的现有类型。 有关定义新类型或扩展现有类型的详细信息,请参阅 扩展对象类型和格式。
生成 Cmdlet
实现 cmdlet 后,必须通过 Windows PowerShell 管理单元将其注册到 Windows PowerShell。 有关注册 cmdlet 的详细信息,请参阅 如何注册 Cmdlet、提供程序和主机应用程序。
测试 Cmdlet
将 cmdlet 注册到 Windows PowerShell 后,通过在命令行上运行它来测试它。 下面是一些测试,这些测试演示如何使用 ProcessId
和 InputObject
参数来测试其参数集以停止进程。
启动 Windows PowerShell 后,运行 Stop-Proc cmdlet,并将
ProcessId
参数设置为基于其标识符停止进程。 在这种情况下,cmdlet 使用ProcessId
参数集来停止进程。PS> Stop-Proc -Id 444 Confirm Are you sure you want to perform this action? Performing operation "Stop-Proc" on Target "notepad (444)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): Y
启动 Windows PowerShell 后,运行 Stop-Proc cmdlet,并将
InputObject
参数设置为停止Get-Process
命令检索的记事本对象上的进程。PS> Get-Process notepad | Stop-Proc Confirm Are you sure you want to perform this action? Performing operation "Stop-Proc" on Target "notepad (444)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): N
另请参阅
创建修改系统 的 Cmdlet