Powershell脚本依赖于另一个参数

时间:2013-06-27 19:10:28

标签: powershell parameters

之前已经发布了一次,但建议的解决方案并没有解决我的问题。我正在写一个脚本,我希望我的一个参数是强制性的,但我只希望它是强制性的,如果其中一个早期参数具有一定的值。

示例:

param([Parameter(Mandatory=$true, Position=0)]
  [ValidateSet("Add","Delete")]
  [string]$Command,

  [Parameter(Mandatory=$true)]
  [string]$Subject
)

我希望仅当Command参数的值为“Add”时才需要Subject参数。

我尝试过使用ParameterSetName值,但这似乎不起作用。

2 个答案:

答案 0 :(得分:2)

您可以尝试执行以下参数:

param (
    [Parameter(ParameterSetName="Add")][switch]$Add,
    [Parameter(ParameterSetName="Delete")][switch]$Delete,
    [Parameter(ParameterSetName="Add",Mandatory=$true)] [Parameter(ParameterSetName="Delete")] [string]$Subject
)

如果您有“添加”开关,则必须使用主题,当您有“删除”开关时,主题参数是可选的。

答案 1 :(得分:2)

您可以选择主题并在脚本正文的开头处理需求,模拟必需参数,如下所示:

param(
  [parameter(Mandatory=$true)][ValidateSet("Add","Delete")] [string]$Command,
  [string] $Subject
)
if (($Command -eq 'Add') -and ($PSBoundParameters['Subject'] -eq $null)) {
  $Subject = Read-Host 'Supply value for the parameter "Subject" (mandatory when the value of "Command" is "Add")'
}

如果未指定参数主题,则条件$PSBoundParameters['Subject'] -eq $null的计算结果为True。请注意,不能只使用$Subject -eq $null,因为如果省略参数, $ Subject 会初始化为空字符串。如果你没有强加 $ Subject (即省略[string]),那么如果它被省略它将为null,但我认为你不想这样做。 / p>

请注意,此允许用户在提示时简单地按[ENTER],将 $ Subject 留空,但这是必需参数的标准行为。如果您不想允许,可以执行以下操作之一(这是在正文中处理复杂参数要求的另一个优点,而不是参数声明)。

抛出错误:

param(
  [parameter(Mandatory=$true)][ValidateSet("Add","Delete")] [string]$Command,
  [string] $Subject
)
if (($Command -eq 'Add') -and ($PSBoundParameters['Subject'] -eq $null)) {
  $Subject = Read-Host 'Supply value for the parameter "Subject" (mandatory when the value of "Command" is "Add"'
  if (-not $Subject) {
    throw "The Subject may not be blank."
  }
}

继续提示,直到提供值:

param(
  [parameter(Mandatory=$true)][ValidateSet("Add","Delete")] [string]$Command,
  [string] $Subject
)
if (($Command -eq 'Add') -and ($PSBoundParameters['Subject'] -eq $null)) {
  do {
    $Subject = Read-Host 'Supply value for the parameter "Subject" (mandatory when the value of "Command" is "Add"'
    if (-not $Subject) {
      Write-Host -NoNewline "The Subject may not be blank. "
    }
  } until ($Subject)
}