如何强制执行两个参数之一,以便始终存在两个参数中的至少一个?

问题描述 投票:0回答:1

mandatory
将使这两个参数成为必需。我只需要确保
path
fileList
始终存在。

我一直在做以下事情,但并不理想:

function foo{
    Param(
    [string[]]$path
    [string[]]$fileList
    )
    if (($null -eq $path) -and ($fileList -eq "")){Write-Error -Message "Paths or FilieList must be used" -ErrorAction Stop}
}

win11/pwsh 7.4

powershell parameter-passing parameter-sets
1个回答
2
投票

尝试以下操作:

function foo {
  [CmdletBinding(DefaultParameterSetName = 'PathAndFileList')]
  Param(

    [Parameter(ParameterSetName='PathOnly', Mandatory)]
    [Parameter(ParameterSetName='PathAndFileList', Mandatory)]
    [string[]]$Path,

    [Parameter(ParameterSetName='FileListOnly', Mandatory)]
    [Parameter(ParameterSetName='PathAndFileList', Mandatory)]
    [string[]]$FileList

  )
  # Diagnostic output: Show which parameters were bound.
  $PSBoundParameters
}

关键是使用参数集

  • 每个参数特定设置一个,适用于在调用时仅绑定两个参数中的仅一个

    PathOnly
    FileListOnly
    )。

  • 当绑定

    两个
    参数时共享一个 (PathAndFileList)。

  • 通过在其所属的所有参数集中将两个参数标记为

    Mandatory
    无参数调用会触发交互式提示,用于为强制参数提供值,或者 - 在启动的会话中通过
    -NonInteractive
    参数 - 触发 错误

    • 通过

      DefaultParameterSetName
      属性,您可以选择 default 参数集,在交互式执行中,它反过来确定在无参数调用中提示哪些参数(或者一般来说,在未绑定目标集中的 all 强制参数的调用中)。

    • 警告:如果选择

      PathAndFileList
      作为默认参数集,则在无参数交互式调用中会提示输入 both
      -Path
      -FileList
      ,并且 不能为空(默认情况下,数组- 类型参数不接受空数组),即您必须both提供至少一个值才能进行调用。
      虽然有一个
      [AllowEmptyCollection()]
      属性,但问题是,如果您将其添加到两个参数,则如果您不输入任何内容/将 @() 传递给两个参数,则会再次启用
       effectively 
      无参数调用。

    • 也就是说,交互式提示的用户体验通常很差,并且在其支持的参数类型方面受到限制。

      • 请参阅 GitHub 问题 #4068 进行讨论,包括建议 always 在缺少强制参数值的情况下抛出错误(与
        -NonInteractive
        一样),这将使此问题变得毫无意义。
© www.soinside.com 2019 - 2024. All rights reserved.