本主题介绍可以在 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
。