【问题标题】:How to set param as mandatory if choice selected from set如果从集合中选择选项,如何将参数设置为强制
【发布时间】:2019-03-12 00:09:31
【问题描述】:

我有以下参数输入和用户可以输入的三个选项:

Param(
    [Parameter(Mandatory=$true)]
    [ValidateSet('View','Add','Remove')]
    [String]$Command,

    [Parameter(Mandatory=$false)]
    [String]$UserID
)

如果$Command 是“添加”或“删除”,我怎样才能强制输入$UserID,而如果命令是“查看”则不是强制性的?

【问题讨论】:

  • 制作不同的参数集,而不是使用一个参数$Command。否则你将不得不使用动态参数。
  • @AnsgarWiechers 我对动态参数很好。我如何做到这一点?
  • 我自己没用过动态参数,不过可能this will help。我的建议是:使用不同的(静态)参数集。
  • @AnsgarWiechers 好的,假设我创建了 $View、$Add 和 $Remove 参数。我怎么能说如果 $Add/$Remove,然后将 $UserID 设置为强制?
  • @AnsgarWiechers 快速提问;所以目前 $userID 将一个值作为输入。是否可以让它接受一串逗号分隔的值,以便一次添加/删除多个 ID,而不必为每个 ID 运行脚本?

标签: powershell parameter-passing


【解决方案1】:

AFAICS 您需要动态参数来满足您的要求(例如参见here)。不过,我个人建议使用不同的(静态)参数集:

[CmdletBinding(DefaultParameterSetName='View')]
Param(
    [Parameter(ParameterSetName='Add', Mandatory=$true)]
    [Switch]$Add,

    [Parameter(ParameterSetName='Remove', Mandatory=$true)]
    [Switch]$Remove,

    [Parameter(ParameterSetName='View', Mandatory=$true)]
    [Switch]$View,

    [Parameter(ParameterSetName='Add', Mandatory=$true)]
    [Parameter(ParameterSetName='Remove', Mandatory=$true)]
    [Parameter(ParameterSetName='View', Mandatory=$false)]
    [String]$UserID
)

switch ($PSCmdlet.ParameterSetName) {
    'Add'    { ... }
    'Remove' { ... }
    'View'   { ... }
}

用法:

PS C:\> test.ps1 -? test.ps1 -查看 [-UserID ] [] test.ps1 -Add -UserID [] test.ps1 -删除 -UserID []

【讨论】:

  • 假设我有基于参数的 if 语句......会是 if($Add) elseif($Remove) else 吗?因为我将 $command 设置为 [string] 我可以使用它,例如 if ($Command -eq 'Add') ,但我不确定如何使用 [switch]
  • @Cataster 你的意思是如何识别函数内部使用的参数集?查看更新的答案。
  • 优秀。我刚刚在我的脚本中实现了这一点。它创造了奇迹:D
猜你喜欢
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
相关资源
最近更新 更多