Cmdlet 动态参数

Cmdlet 可以定义在特殊条件下(例如,当另一个参数的 参数是特定值时)可供用户使用的参数。 这些参数在运行时添加,并称为动态参数,因为它们仅在需要时添加。 例如,可以设计一个 cmdlet,该 cmdlet 仅在指定特定开关参数时添加多个参数。

备注

提供程序和 PowerShell 函数还可以定义动态参数。

PowerShell cmdlet 中的动态参数

PowerShell 在其多个提供程序 cmdlet 中使用动态参数。 例如,当 Path 参数指定证书提供程序路径时, 和 cmdlet 将在运行时添加 Get-Item Get-ChildItem CodeSigningCert 参数。 如果 Path 参数指定其他提供程序的路径 ,CodeSigningCert 参数将不可用。

以下示例显示在运行时 运行时如何添加 CodeSigningCert Get-Item 参数。

此示例中,PowerShell 运行时已添加 参数,cmdlet 成功。

Get-Item -Path cert:\CurrentUser -CodeSigningCert
Location   : CurrentUser
StoreNames : {SmartCardRoot, UserDS, AuthRoot, CA...}

本示例指定了 FileSystem 驱动器,并返回了错误。 错误消息指示找不到 CodeSigningCert 参数。

Get-Item -Path C:\ -CodeSigningCert
Get-Item : A parameter cannot be found that matches parameter name 'codesigningcert'.
At line:1 char:37
+  get-item -path C:\ -codesigningcert <<<<
--------
    CategoryInfo          : InvalidArgument: (:) [Get-Item], ParameterBindingException
    FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetItemCommand

支持动态参数

若要支持动态参数,必须在 cmdlet 代码中包含以下元素。

接口

System.Management.Automation.IDynamicParameters。 此接口提供检索动态参数的方法。

例如:

public class SendGreetingCommand : Cmdlet, IDynamicParameters

方法

System.Management.Automation.IDynamicParameters.GetDynamicParameters。 此方法检索包含动态参数定义的 对象。

例如:

 public object GetDynamicParameters()
 {
   if (employee)
   {
     context= new SendGreetingCommandDynamicParameters();
     return context;
   }
   return null;
}
private SendGreetingCommandDynamicParameters context;

定义要添加的动态参数的类。 此类必须包含每个 参数的 Parameter 属性以及 cmdlet 所需的任何可选 Alias 和 Validation 属性。

例如:

public class SendGreetingCommandDynamicParameters
{
  [Parameter]
  [ValidateSet ("Marketing", "Sales", "Development")]
  public string Department
  {
    get { return department; }
    set { department = value; }
  }
  private string department;
}

有关支持动态参数的 cmdlet 的完整示例,请参阅 如何声明动态参数

另请参阅

System.Management.Automation.IDynamicParameters

System.Management.Automation.IDynamicParameters.GetDynamicParameters

如何声明动态参数

编写 Windows PowerShell Cmdlet