3

我有一个 PowerShell 函数,它接受一个可选参数,使用 a 进行验证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作为第一个参数调用时有效,但在省略参数时失败。有趣的是,如果我从参数定义中删除了 theParameterAttribute或 the ValidateSetAttribute,它就会起作用。

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

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

虽然这很好用,但如果我想检查该值,它有一个缺点AA参数的默认值$PSBoundParameters也是如此,当省略参数并应用默认值时,它不会被添加。所以我需要修改我的检查以明确检查:

if (-not $PSBoundParameters.ContainsKey('Target') -or $PSBoundParameters.Target -eq 'A')) {
    # Add new parameter here...
}

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

4

1 回答 1

5

If you need run correctly in case PSDebug is running in strict mode ( set-psdebug -strict ), you can do something like this:

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
}
于 2013-02-27T16:37:25.837 回答