动态参数访问默认值

时间:2013-02-27 14:31:37

标签: powershell optional-parameters strict-mode

我有一个PowerShell函数,它接受一个可选参数,使用ValidateSetAttribute验证,并根据该值添加另一个动态参数。但是,在严格模式下,当试图访问DynamicParam块内的参数时,我没有明确地设置所述参数,那么我得到一个错误,即变量未定义

Param(
    [Parameter()]
    [ValidateSet('A', 'B')]
    [string] $Target = 'A'
)
DynamicParam {
    if ($Target -eq 'B') { # <- Here it fails
        # Add new parameter here...
    }
}
end {
    Write-Host $Target
}

当使用AB作为第一个参数调用时,脚本可以正常工作,但在省略参数时会失败。有趣的是,如果我从参数定义中移除ParameterAttributeValidateSetAttribute,它就可以工作。

我目前的解决方法是使用$PSBoundParameters访问变量并检查参数是否已设置,如下所示:

if ($PSBoundParameters.ContainsKey('Target') -and $PSBoundParameters.Target -eq 'B') {
    # Add new parameter here...
}

虽然这样可行,但如果我想检查值A,则有一个缺点:由于A是参数的默认值,它不会是省略参数并应用默认值时,将$PSBoundParameters添加到if (-not $PSBoundParameters.ContainsKey('Target') -or $PSBoundParameters.Target -eq 'A')) { # Add new parameter here... } 。所以我需要修改我的支票以明确检查:

DynamicParam

我真的不喜欢这个解决方案,因为它会不必要地将动态参数添加与默认值联系起来。理想情况下,我希望能够更改默认值而无需触及任何其他内容。有没有办法从{{1}}块中访问实际参数值?或者是否至少有可能访问参数定义并访问默认值?

1 个答案:

答案 0 :(得分:4)

如果您需要在PSDebug模式(strict)中运行set-psdebug -strict时正确运行,您可以执行以下操作:

Param(
    [Parameter()]
    [ValidateSet('A', 'B')]
    [string] $Target = 'A'
)

DynamicParam {

    # Ensure $Target is defined
    try { [void]$Target }
    catch { $Target = [string]::Empty }

    if ($Target -eq 'B') {
        write-host "si si"
    }
}
end {
    Write-Host $Target
}