powershell 将[ref]参数作为可选参数添加到函数中,其行为与强制行为相同

9udxz4iz  于 2023-04-30  发布在  Shell
关注(0)|答案(1)|浏览(129)

我有一个很长时间的工作函数,现在需要添加一个可选[ref]参数。新的函数头:

function Wait-ForRunningJobs
{
    Param(
        $jobs,
        [int]$jobsLimit,
        [Switch]$SilentlyContinue,
        [switch]$writeOutput,
        [switch]$noTabs,
        [switch]$failOnError,
        [switch]$keepFailedJobs,
        [Parameter(Mandatory = $false)]
        [ref]$failedJobs
    )
*
*
*
*
}

当我这样称呼它的时候,一切都很好:

Wait-ForRunningJobs -failedJobs ([ref]$failedJobsList) -jobs $jobs -writeOutput -noTabs -keepFailedJobs -SilentlyContinue

但是我对函数的其他调用看起来像这样

Wait-ForRunningJobs $jobs $asyncJobsLimit -writeOutput -SilentlyContinue $shouldIgnoreErrors

失败,并出现以下错误:

Cannot process argument transformation on parameter 'failedJobs'. Reference type is expected in argument.

我试着用参数名调用函数,但仍然得到同样的错误

Wait-ForRunningJobs -jobs $jobs -jobsLimit $asyncJobsLimit -writeOutput $true -SilentlyContinue $true -failOnError $shouldIgnoreErrors
kognpnkq

kognpnkq1#

为了将 * 值 * 传递给[switch]类型的参数(只能是$true$false),必须**使用:**将参数名与其值分隔开

# Note the ":" between -SilentlyContinue and $shouldIgnoreErrors
Wait-ForRunningJobs $jobs $asyncJobsLimit -writeOutput -SilentlyContinue:$shouldIgnoreErrors

如果没有:$shouldIgnoreErrors被认为是一个 * 单独的 未命名的 * 参数,它 * 位置地 * 绑定,在手头的情况下意味着绑定到 * 第三个 * 位置参数,[1]这恰好是[ref]类型的-failedJobs参数(因此失败,因为只有[ref]示例可以传递给[ref]类型的参数)。
请注意,虽然您可以 * 总是 * 使用:来将参数名称与其值分开,但这样做是罕见的,并且仅在[switch]参数的情况下 * 在语法上是必要的 *,[switch]参数是PowerShell中唯一 * 可选 * 接受 named 参数中的值的参数类型。因此需要:来消除这种可选值与后续 * 位置 * 参数(绑定到 * 不同 * 参数)的歧义。
[1]请注意,非[switch]参数声明是基于其声明顺序的位置 * 默认情况下 *。
您可以选择退出此选项,方法是通过修饰您的param(…)[CmdletBinding()]属性并将其PositionalBinding属性设置为$false(例如。例如,[CmdletBinding(PositionalBinding=$false)]),这使得所有参数在默认情况下是非位置性的。
然后,您可以使用 selective opt-in 进行位置绑定,方法是使用[Parameter()]属性装饰单个参数,并将后者的Position属性设置为位置编号,该编号确定相对于以这种方式声明的其他参数的编号的位置(0通常用于指定 * 第一个 * 位置参数)。
请参阅概念性的about_Functions_CmdletBindingAttributeabout_Functions_Advanced_Parameters帮助主题。

相关问题