我有一个很长时间的工作函数,现在需要添加一个可选[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
1条答案
按热度按时间kognpnkq1#
为了将 * 值 * 传递给
[switch]
类型的参数(只能是$true
或$false
),必须**使用:
**将参数名与其值分隔开如果没有
:
,$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_CmdletBindingAttribute和about_Functions_Advanced_Parameters帮助主题。