Cmdlet 参数的类型

本主题介绍可以在 cmdlet 中声明的不同类型的参数。 Cmdlet 参数可以是位置、命名、必需、可选或切换参数。

位置参数和命名参数

所有 cmdlet 参数都命名或位置参数。 命名参数要求在调用 cmdlet 时键入参数名称和参数。 位置参数只需要按相对顺序键入参数。 然后,系统将第一个未命名参数映射到第一个位置参数。 系统将第二个未命名参数映射到第二个未命名参数,依此推。 默认情况下,所有 cmdlet 参数都命名为参数。

若要定义命名参数,请省略 Parameter 属性声明中的 Position 关键字,如以下参数声明所示。

[Parameter(ValueFromPipeline=true)]
public string UserName
{
  get { return userName; }
  set { userName = value; }
}
private string userName;

若要定义位置参数,请在 Parameter 属性声明中添加 Position 关键字,然后指定位置。 在下面的示例中,UserName 参数声明为位置 0 的位置参数。 这意味着调用的第一个参数会自动绑定到此参数。

[Parameter(Position = 0)]
public string UserName
{
  get { return userName; }
  set { userName = value; }
}
private string userName;

注释

良好的 cmdlet 设计建议将最常用的参数声明为位置参数,以便在运行 cmdlet 时用户不必输入参数名称。

位置参数和命名参数接受用逗号分隔的单个参数或多个参数。 仅当参数接受一个集合(如字符串数组)时,才允许多个参数。 可以在同一 cmdlet 中混合位置参数和命名参数。 在这种情况下,系统会先检索命名参数,然后尝试将其余未命名参数映射到位置参数。

以下命令显示了可以为 Get-Command cmdlet 的参数指定单个参数和多个参数的不同方式。 请注意,在最后两个示例中,无需指定 -Name,因为 Name 参数定义为位置参数。

Get-Command -Name Get-Service
Get-Command -Name Get-Service,Set-Service
Get-Command Get-Service
Get-Command Get-Service,Set-Service

必需参数和可选参数

还可以将 cmdlet 参数定义为必需或可选参数。 (必须在 PowerShell 运行时调用 cmdlet 之前指定强制参数。默认情况下,参数定义为可选参数。

若要定义必需参数,请在 Parameter 属性声明中添加 Mandatory 关键字,并将其设置为 true,如以下参数声明所示。

[Parameter(Position = 0, Mandatory = true)]
public string UserName
{
  get { return userName; }
  set { userName = value; }
}
private string userName;

若要定义可选参数,请省略 Parameter 属性声明中的 Mandatory 关键字,如以下参数声明所示。

[Parameter(Position = 0)]
public string UserName
{
  get { return userName; }
  set { userName = value; }
}
private string userName;

开关参数

PowerShell 提供了 System.Management.Automation.SwitchParameter 类型,该类型允许定义其默认值 false 的参数,除非调用 cmdlet 时指定了参数。 尽可能使用开关参数,而不是布尔参数。

请考虑以下示例。 许多 PowerShell cmdlet 返回输出。 但是,这些 cmdlet 具有替代默认行为的 PassThru switch 参数。 使用 PassThru 参数时,cmdlet 会将输出对象返回到管道。

若要定义 switch 参数,请将属性声明为 [SwitchParameter] 类型,如以下示例所示。

[Parameter()]
public SwitchParameter GoodBye
{
  get { return goodbye; }
  set { goodbye = value; }
}
private bool goodbye;

若要在指定 cmdlet 时对参数执行作,请使用以下结构中的一种输入处理方法。

protected override void ProcessRecord()
{
  WriteObject("Switch parameter test: " + userName + ".");
  if (goodbye)
  {
    WriteObject(" Goodbye!");
  }
} // End ProcessRecord

默认情况下,开关参数从位置参数中排除。 可以 替代 参数 属性中的参数,但它可能会使用户感到困惑。

设计开关参数,以便使用参数将命令的默认行为更改为不太常见或更复杂的模式。 命令的最简单行为应该是不需要使用 switch 参数的默认行为。 将开关控制的行为基于开关的值,而不是参数的存在。

可通过多种方式测试是否存在开关参数:

  • Invocation.BoundParameters 包含 switch 参数名称作为键
  • 当开关定义唯一参数集时 PSCmdlet.ParameterSetName

例如,可以使用 -MySwitch:$false 或旋转为交换机提供显式值。 如果仅测试参数是否存在,则命令的行为就像开关值 $true 而不是 $false

另请参阅

编写 Windows PowerShell Cmdlet